views.pas 340 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635
  1. { $Id$ }
  2. {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
  3. { }
  4. { System independent GRAPHICAL clone of VIEWS.PAS }
  5. { }
  6. { Interface Copyright (c) 1992 Borland International }
  7. { }
  8. { Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer }
  9. { [email protected] - primary e-mail address }
  10. { [email protected] - backup e-mail address }
  11. { }
  12. {****************[ THIS CODE IS FREEWARE ]*****************}
  13. { }
  14. { This sourcecode is released for the purpose to }
  15. { promote the pascal language on all platforms. You may }
  16. { redistribute it and/or modify with the following }
  17. { DISCLAIMER. }
  18. { }
  19. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  20. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  21. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  22. { }
  23. {*****************[ SUPPORTED PLATFORMS ]******************}
  24. { 16 and 32 Bit compilers }
  25. { DOS - Turbo Pascal 7.0 + (16 Bit) }
  26. { DPMI - Turbo Pascal 7.0 + (16 Bit) }
  27. { - FPC 0.9912+ (GO32V2) (32 Bit) }
  28. { WINDOWS - Turbo Pascal 7.0 + (16 Bit) }
  29. { - Delphi 1.0+ (16 Bit) }
  30. { WIN95/NT - Delphi 2.0+ (32 Bit) }
  31. { - Virtual Pascal 2.0+ (32 Bit) }
  32. { - Speedsoft Sybil 2.0+ (32 Bit) }
  33. { - FPC 0.9912+ (32 Bit) }
  34. { OS2 - Virtual Pascal 1.0+ (32 Bit) }
  35. { }
  36. {******************[ REVISION HISTORY ]********************}
  37. { Version Date Fix }
  38. { ------- --------- --------------------------------- }
  39. { 1.00 10 Nov 96 First multi platform release }
  40. { 1.10 29 Aug 97 Platform.inc sort added. }
  41. { 1.20 12 Sep 97 FPK pascal 0.92 conversion added. }
  42. { 1.30 10 Jun 98 Virtual pascal 2.0 code added. }
  43. { 1.40 10 Jul 99 Sybil 2.0 code added }
  44. { 1.41 03 Nov 99 FPC Windows support added. }
  45. { 1.50 26 Nov 99 Graphics stuff moved to GFVGraph }
  46. {**********************************************************}
  47. UNIT Views;
  48. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  49. INTERFACE
  50. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  51. {====Include file to sort compiler platform out =====================}
  52. {$I Platform.inc}
  53. {====================================================================}
  54. {==== Compiler directives ===========================================}
  55. {$IFNDEF PPC_FPC}{ FPC doesn't support these switches }
  56. {$F+} { Force far calls - Used because of the FirstThat, ForNext ... }
  57. {$A+} { Word Align Data }
  58. {$B-} { Allow short circuit boolean evaluations }
  59. {$O+} { This unit may be overlaid }
  60. {$G+} { 286 Code optimization - if you're on an 8088 get a real computer }
  61. {$P-} { Normal string variables }
  62. {$N-} { No 80x87 code generation }
  63. {$E+} { Emulation is on }
  64. {$ENDIF}
  65. {$X+} { Extended syntax is ok }
  66. {$R-} { Disable range checking }
  67. {$S-} { Disable Stack Checking }
  68. {$I-} { Disable IO Checking }
  69. {$Q-} { Disable Overflow Checking }
  70. {$V-} { Turn off strict VAR strings }
  71. {====================================================================}
  72. USES
  73. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  74. {$IFNDEF PPC_SPEED} { NON SPEEDSOFT SYBIL2+ }
  75. {$IFDEF PPC_FPC} { FPC WINDOWS COMPILER }
  76. Windows, { Standard unit }
  77. {$ELSE} { OTHER COMPILERS }
  78. WinTypes, WinProcs, { Stardard units }
  79. {$ENDIF}
  80. {$IFDEF PPC_BP} Win31, {$ENDIF} { Standard 3.1 unit }
  81. {$IFDEF PPC_DELPHI} Messages, {$ENDIF} { Delphi3+ unit }
  82. {$ELSE} { SPEEDSOFT SYBIL2+ }
  83. WinBase, WinDef, WinUser, WinGDI, { Standard unit }
  84. {$ENDIF}
  85. {$ENDIF}
  86. {$IFDEF OS_OS2} { OS2 CODE }
  87. OS2Def, OS2Base, OS2PMAPI, { Standard units }
  88. {$ENDIF}
  89. Common, GFVGraph, Objects, Drivers; { GFV standard units }
  90. {***************************************************************************}
  91. { PUBLIC CONSTANTS }
  92. {***************************************************************************}
  93. {---------------------------------------------------------------------------}
  94. { TView STATE MASKS }
  95. {---------------------------------------------------------------------------}
  96. CONST
  97. sfVisible = $0001; { View visible mask }
  98. sfCursorVis = $0002; { Cursor visible }
  99. sfCursorIns = $0004; { Cursor insert mode }
  100. sfShadow = $0008; { View has shadow }
  101. sfActive = $0010; { View is active }
  102. sfSelected = $0020; { View is selected }
  103. sfFocused = $0040; { View is focused }
  104. sfDragging = $0080; { View is dragging }
  105. sfDisabled = $0100; { View is disabled }
  106. sfModal = $0200; { View is modal }
  107. sfDefault = $0400; { View is default }
  108. sfExposed = $0800; { View is exposed }
  109. sfIconised = $1000; { View is iconised }
  110. {---------------------------------------------------------------------------}
  111. { TView OPTION MASKS }
  112. {---------------------------------------------------------------------------}
  113. CONST
  114. ofSelectable = $0001; { View selectable }
  115. ofTopSelect = $0002; { Top selectable }
  116. ofFirstClick = $0004; { First click react }
  117. ofFramed = $0008; { View is framed }
  118. ofPreProcess = $0010; { Pre processes }
  119. ofPostProcess = $0020; { Post processes }
  120. ofBuffered = $0040; { View is buffered }
  121. ofTileable = $0080; { View is tileable }
  122. ofCenterX = $0100; { View centred on x }
  123. ofCenterY = $0200; { View centred on y }
  124. ofCentered = $0300; { View x,y centred }
  125. ofValidate = $0400; { View validates }
  126. ofVersion = $3000; { View TV version }
  127. ofVersion10 = $0000; { TV version 1 view }
  128. ofVersion20 = $1000; { TV version 2 view }
  129. ofGFVModeView = $4000; { View is in GFV mode }
  130. {---------------------------------------------------------------------------}
  131. { TView GROW MODE MASKS }
  132. {---------------------------------------------------------------------------}
  133. CONST
  134. gfGrowLoX = $01; { Left side grow }
  135. gfGrowLoY = $02; { Top side grow }
  136. gfGrowHiX = $04; { Right side grow }
  137. gfGrowHiY = $08; { Bottom side grow }
  138. gfGrowAll = $0F; { Grow on all sides }
  139. gfGrowRel = $10; { Grow relative }
  140. {---------------------------------------------------------------------------}
  141. { TView DRAG MODE MASKS }
  142. {---------------------------------------------------------------------------}
  143. CONST
  144. dmDragMove = $01; { Move view }
  145. dmDragGrow = $02; { Grow view }
  146. dmLimitLoX = $10; { Limit left side }
  147. dmLimitLoY = $20; { Limit top side }
  148. dmLimitHiX = $40; { Limit right side }
  149. dmLimitHiY = $80; { Limit bottom side }
  150. dmLimitAll = $F0; { Limit all sides }
  151. {---------------------------------------------------------------------------}
  152. { >> NEW << TView OPTION MASKS }
  153. {---------------------------------------------------------------------------}
  154. CONST
  155. goThickFramed = $0001; { Thick framed mask }
  156. goDrawFocus = $0002; { Draw focus mask }
  157. goTitled = $0004; { Draw titled mask }
  158. goTabSelect = $0008; { Tab selectable }
  159. goEveryKey = $0020; { Report every key }
  160. goEndModal = $0040; { End modal }
  161. goGraphView = $1000; { Raw graphic view }
  162. goGraphical = $2000; { Graphical view }
  163. goNativeClass = $4000; { Native class window }
  164. goNoDrawView = $8000; { View does not draw }
  165. {---------------------------------------------------------------------------}
  166. { >> NEW << TAB OPTION MASKS }
  167. {---------------------------------------------------------------------------}
  168. CONST
  169. tmTab = $01; { Tab move mask }
  170. tmShiftTab = $02; { Shift+tab move mask }
  171. tmEnter = $04; { Enter move mask }
  172. tmLeft = $08; { Left arrow move mask }
  173. tmRight = $10; { Right arrow move mask }
  174. tmUp = $20; { Up arrow move mask }
  175. tmDown = $40; { Down arrow move mask }
  176. {---------------------------------------------------------------------------}
  177. { >> NEW << VIEW DRAW MASKS }
  178. {---------------------------------------------------------------------------}
  179. CONST
  180. vdBackGnd = $01; { Draw backgound }
  181. vdInner = $02; { Draw inner detail }
  182. vdCursor = $04; { Draw cursor }
  183. vdBorder = $08; { Draw view border }
  184. vdFocus = $10; { Draw focus state }
  185. vdNoChild = $20; { Draw no children }
  186. {---------------------------------------------------------------------------}
  187. { TView HELP CONTEXTS }
  188. {---------------------------------------------------------------------------}
  189. CONST
  190. hcNoContext = 0; { No view context }
  191. hcDragging = 1; { No drag context }
  192. {---------------------------------------------------------------------------}
  193. { TWindow FLAG MASKS }
  194. {---------------------------------------------------------------------------}
  195. CONST
  196. wfMove = $01; { Window can move }
  197. wfGrow = $02; { Window can grow }
  198. wfClose = $04; { Window can close }
  199. wfZoom = $08; { Window can zoom }
  200. {---------------------------------------------------------------------------}
  201. { TWindow PALETTES }
  202. {---------------------------------------------------------------------------}
  203. CONST
  204. wpBlueWindow = 0; { Blue palette }
  205. wpCyanWindow = 1; { Cyan palette }
  206. wpGrayWindow = 2; { Gray palette }
  207. {---------------------------------------------------------------------------}
  208. { COLOUR PALETTES }
  209. {---------------------------------------------------------------------------}
  210. CONST
  211. CFrame = #1#1#2#2#3; { Frame palette }
  212. CScrollBar = #4#5#5; { Scrollbar palette }
  213. CScroller = #6#7; { Scroller palette }
  214. CListViewer = #26#26#27#28#29; { Listviewer palette }
  215. CBlueWindow = #8#9#10#11#12#13#14#15; { Blue window palette }
  216. CCyanWindow = #16#17#18#19#20#21#22#23; { Cyan window palette }
  217. CGrayWindow = #24#25#26#27#28#29#30#31; { Grey window palette }
  218. {---------------------------------------------------------------------------}
  219. { TScrollBar PART CODES }
  220. {---------------------------------------------------------------------------}
  221. CONST
  222. sbLeftArrow = 0; { Left arrow part }
  223. sbRightArrow = 1; { Right arrow part }
  224. sbPageLeft = 2; { Page left part }
  225. sbPageRight = 3; { Page right part }
  226. sbUpArrow = 4; { Up arrow part }
  227. sbDownArrow = 5; { Down arrow part }
  228. sbPageUp = 6; { Page up part }
  229. sbPageDown = 7; { Page down part }
  230. sbIndicator = 8; { Indicator part }
  231. {---------------------------------------------------------------------------}
  232. { TScrollBar OPTIONS FOR TWindow.StandardScrollBar }
  233. {---------------------------------------------------------------------------}
  234. CONST
  235. sbHorizontal = $0000; { Horz scrollbar }
  236. sbVertical = $0001; { Vert scrollbar }
  237. sbHandleKeyboard = $0002; { Handle keyboard }
  238. {---------------------------------------------------------------------------}
  239. { STANDARD COMMAND CODES }
  240. {---------------------------------------------------------------------------}
  241. CONST
  242. cmValid = 0; { Valid command }
  243. cmQuit = 1; { Quit command }
  244. cmError = 2; { Error command }
  245. cmMenu = 3; { Menu command }
  246. cmClose = 4; { Close command }
  247. cmZoom = 5; { Zoom command }
  248. cmResize = 6; { Resize command }
  249. cmNext = 7; { Next view command }
  250. cmPrev = 8; { Prev view command }
  251. cmHelp = 9; { Help command }
  252. cmOK = 10; { Okay command }
  253. cmCancel = 11; { Cancel command }
  254. cmYes = 12; { Yes command }
  255. cmNo = 13; { No command }
  256. cmDefault = 14; { Default command }
  257. cmCut = 20; { Clipboard cut cmd }
  258. cmCopy = 21; { Clipboard copy cmd }
  259. cmPaste = 22; { Clipboard paste cmd }
  260. cmUndo = 23; { Clipboard undo cmd }
  261. cmClear = 24; { Clipboard clear cmd }
  262. cmTile = 25; { Tile subviews cmd }
  263. cmCascade = 26; { Cascade subviews cmd }
  264. cmReceivedFocus = 50; { Received focus }
  265. cmReleasedFocus = 51; { Released focus }
  266. cmCommandSetChanged = 52; { Commands changed }
  267. cmScrollBarChanged = 53; { Scrollbar changed }
  268. cmScrollBarClicked = 54; { Scrollbar clicked on }
  269. cmSelectWindowNum = 55; { Select window }
  270. cmListItemSelected = 56; { Listview item select }
  271. cmNotify = 27;
  272. cmIdCommunicate = 28; { Communicate via id }
  273. cmIdSelect = 29; { Select via id }
  274. {---------------------------------------------------------------------------}
  275. { TWindow NUMBER CONSTANTS }
  276. {---------------------------------------------------------------------------}
  277. CONST
  278. wnNoNumber = 0; { Window has no num }
  279. MaxViewWidth = 132; { Max view width }
  280. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  281. {$IFDEF BIT_16} { WINDOWS 16 BIT CODE }
  282. {---------------------------------------------------------------------------}
  283. { WIN16 LABEL CONSTANTS FOR WINDOW PROPERTY CALLS }
  284. {---------------------------------------------------------------------------}
  285. CONST
  286. ViewSeg = 'TVWINSEG'+#0; { View segment label }
  287. ViewOfs = 'TVWINOFS'+#0; { View offset label }
  288. {$ENDIF}
  289. {$IFDEF BIT_32} { WINDOWS 32 BIT CODE }
  290. {---------------------------------------------------------------------------}
  291. { WIN32/NT LABEL CONSTANTS FOR WINDOW PROPERTY CALLS }
  292. {---------------------------------------------------------------------------}
  293. CONST
  294. ViewPtr = 'TVWINPTR'+#0; { View ptr label }
  295. {$ENDIF}
  296. {$ENDIF}
  297. {***************************************************************************}
  298. { PUBLIC TYPE DEFINITIONS }
  299. {***************************************************************************}
  300. {---------------------------------------------------------------------------}
  301. { TWindow Title string }
  302. {---------------------------------------------------------------------------}
  303. TYPE
  304. TTitleStr = String[80]; { Window title string }
  305. {---------------------------------------------------------------------------}
  306. { COMMAND SET RECORD }
  307. {---------------------------------------------------------------------------}
  308. TYPE
  309. TCommandSet = SET OF Byte; { Command set record }
  310. PCommandSet = ^TCommandSet; { Ptr to command set }
  311. {---------------------------------------------------------------------------}
  312. { PALETTE RECORD }
  313. {---------------------------------------------------------------------------}
  314. TYPE
  315. TPalette = String; { Palette record }
  316. PPalette = ^TPalette; { Pointer to palette }
  317. {---------------------------------------------------------------------------}
  318. { TDrawBuffer RECORD }
  319. {---------------------------------------------------------------------------}
  320. TYPE
  321. TDrawBuffer = Array [0..MaxViewWidth - 1] Of Word; { Draw buffer record }
  322. PDrawBuffer = ^TDrawBuffer; { Ptr to draw buffer }
  323. {---------------------------------------------------------------------------}
  324. { TVideoBuffer RECORD }
  325. {---------------------------------------------------------------------------}
  326. TYPE
  327. TVideoBuf = ARRAY [0..3999] of Word; { Video buffer }
  328. PVideoBuf = ^TVideoBuf; { Pointer to buffer }
  329. {---------------------------------------------------------------------------}
  330. { TComplexArea RECORD }
  331. {---------------------------------------------------------------------------}
  332. TYPE
  333. PComplexArea = ^TComplexArea; { Complex area }
  334. TComplexArea = PACKED RECORD
  335. X1, Y1 : Integer; { Top left corner }
  336. X2, Y2 : Integer; { Lower right corner }
  337. NextArea: PComplexArea; { Next area pointer }
  338. END;
  339. {***************************************************************************}
  340. { PUBLIC OBJECT DEFINITIONS }
  341. {***************************************************************************}
  342. TYPE
  343. PGroup = ^TGroup; { Pointer to group }
  344. {---------------------------------------------------------------------------}
  345. { TView OBJECT - ANCESTOR VIEW OBJECT }
  346. {---------------------------------------------------------------------------}
  347. PView = ^TView;
  348. TView = OBJECT (TObject)
  349. GrowMode : Byte; { View grow mode }
  350. DragMode : Byte; { View drag mode }
  351. DrawMask : Byte; { Draw masks }
  352. TabMask : Byte; { Tab move masks }
  353. ColourOfs : Integer; { View palette offset }
  354. HelpCtx : Word; { View help context }
  355. State : Word; { View state masks }
  356. Options : Word; { View options masks }
  357. EventMask : Word; { View event masks }
  358. GOptions : Word; { Graphics options }
  359. Origin : TPoint; { View origin }
  360. Size : TPoint; { View size }
  361. Cursor : TPoint; { Cursor position }
  362. RawOrigin : TPoint; { View raw origin }
  363. RawSize : TPoint; { View raw size }
  364. Next : PView; { Next peerview }
  365. Owner : PGroup; { Owner group }
  366. HoldLimit : PComplexArea; { Hold limit values }
  367. {$IFDEF OS_WINDOWS} { WIN/NT DATA ONLY }
  368. ExStyle : LongInt; { Extended style }
  369. Dc : HDc; { Device context }
  370. {$ENDIF}
  371. {$IFDEF OS_OS2} { OS2 DATA ONLY }
  372. lStyle : LongInt; { Style }
  373. Client : HWnd; { Client handle }
  374. Ps : HPs; { Paint structure }
  375. {$ENDIF}
  376. {$IFNDEF OS_DOS} { WIN/NT/OS2 DATA ONLY }
  377. FrameSize : Integer; { Frame size (X) }
  378. CaptSize : Integer; { Caption size (Y) }
  379. HWindow : HWnd; { Window handle }
  380. {$ENDIF}
  381. CONSTRUCTOR Init (Var Bounds: TRect);
  382. CONSTRUCTOR Load (Var S: TStream);
  383. DESTRUCTOR Done; Virtual;
  384. FUNCTION Prev: PView;
  385. FUNCTION Execute: Word; Virtual;
  386. FUNCTION Focus: Boolean;
  387. FUNCTION DataSize: Word; Virtual;
  388. FUNCTION TopView: PView;
  389. FUNCTION PrevView: PView;
  390. FUNCTION NextView: PView;
  391. FUNCTION GetHelpCtx: Word; Virtual;
  392. FUNCTION EventAvail: Boolean;
  393. FUNCTION GetPalette: PPalette; Virtual;
  394. FUNCTION GetColor (Color: Word): Word;
  395. FUNCTION Valid (Command: Word): Boolean; Virtual;
  396. FUNCTION GetState (AState: Word): Boolean;
  397. FUNCTION TextWidth (Txt: String): Integer;
  398. FUNCTION MouseInView (Point: TPoint): Boolean;
  399. FUNCTION CommandEnabled (Command: Word): Boolean;
  400. FUNCTION OverLapsArea (X1, Y1, X2, Y2: Integer): Boolean;
  401. FUNCTION MouseEvent (Var Event: TEvent; Mask: Word): Boolean;
  402. PROCEDURE Hide;
  403. PROCEDURE Show;
  404. PROCEDURE Draw; Virtual;
  405. PROCEDURE Select;
  406. PROCEDURE Awaken; Virtual;
  407. PROCEDURE DrawView;
  408. PROCEDURE MakeFirst;
  409. PROCEDURE DrawFocus; Virtual;
  410. PROCEDURE DrawCursor; Virtual;
  411. PROCEDURE DrawBorder; Virtual;
  412. PROCEDURE HideCursor;
  413. PROCEDURE ShowCursor;
  414. PROCEDURE BlockCursor;
  415. PROCEDURE NormalCursor;
  416. PROCEDURE FocusFromTop; Virtual;
  417. PROCEDURE SetViewLimits;
  418. PROCEDURE DrawBackGround; Virtual;
  419. PROCEDURE ReleaseViewLimits;
  420. PROCEDURE MoveTo (X, Y: Integer);
  421. PROCEDURE GrowTo (X, Y: Integer);
  422. PROCEDURE SetDrawMask (Mask: Byte);
  423. PROCEDURE EndModal (Command: Word); Virtual;
  424. PROCEDURE SetCursor (X, Y: Integer);
  425. PROCEDURE PutInFrontOf (Target: PView);
  426. PROCEDURE DisplaceBy (Dx, Dy: Integer); Virtual;
  427. PROCEDURE SetCommands (Commands: TCommandSet);
  428. PROCEDURE ReDrawArea (X1, Y1, X2, Y2: Integer);
  429. PROCEDURE EnableCommands (Commands: TCommandSet);
  430. PROCEDURE DisableCommands (Commands: TCommandSet);
  431. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  432. PROCEDURE SetCmdState (Commands: TCommandSet; Enable: Boolean);
  433. PROCEDURE GetData (Var Rec); Virtual;
  434. PROCEDURE SetData (Var Rec); Virtual;
  435. PROCEDURE Store (Var S: TStream);
  436. PROCEDURE Locate (Var Bounds: TRect);
  437. PROCEDURE KeyEvent (Var Event: TEvent);
  438. PROCEDURE GetEvent (Var Event: TEvent); Virtual;
  439. PROCEDURE PutEvent (Var Event: TEvent); Virtual;
  440. PROCEDURE GetExtent (Var Extent: TRect);
  441. PROCEDURE GetBounds (Var Bounds: TRect);
  442. PROCEDURE SetBounds (Var Bounds: TRect);
  443. PROCEDURE GetClipRect (Var Clip: TRect);
  444. PROCEDURE ClearEvent (Var Event: TEvent);
  445. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  446. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  447. PROCEDURE SizeLimits (Var Min, Max: TPoint); Virtual;
  448. PROCEDURE GetCommands (Var Commands: TCommandSet);
  449. PROCEDURE GetPeerViewPtr (Var S: TStream; Var P);
  450. PROCEDURE PutPeerViewPtr (Var S: TStream; P: PView);
  451. PROCEDURE CalcBounds (Var Bounds: TRect; Delta: TPoint); Virtual;
  452. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  453. FUNCTION GetClassId: LongInt; Virtual;
  454. FUNCTION GetClassName: String; Virtual;
  455. FUNCTION GetClassText: String; Virtual;
  456. FUNCTION GetClassAttr: LongInt; Virtual;
  457. FUNCTION GetNotifyCmd: LongInt; Virtual;
  458. FUNCTION GetMsgHandler: Pointer; Virtual;
  459. {$ENDIF}
  460. FUNCTION Exposed: Boolean; { This needs help!!!!! }
  461. PROCEDURE GraphLine (X1, Y1, X2, Y2: Integer; Colour: Byte);
  462. PROCEDURE GraphRectangle (X1, Y1, X2, Y2: Integer; Colour: Byte);
  463. PROCEDURE ClearArea (X1, Y1, X2, Y2: Integer; Colour: Byte);
  464. PROCEDURE GraphArc (Xc, Yc: Integer; Sa, Ea: Real; XRad, YRad: Integer;
  465. Colour: Byte);
  466. PROCEDURE FilletArc (Xc, Yc: Integer; Sa, Ea: Real; XRad, YRad, Ht: Integer;
  467. Colour: Byte);
  468. PROCEDURE BicolorRectangle (X1, Y1, X2, Y2: Integer; Light, Dark: Byte;
  469. Down: Boolean);
  470. PROCEDURE WriteBuf (X, Y, W, H: Integer; Var Buf);
  471. PROCEDURE WriteLine (X, Y, W, H: Integer; Var Buf);
  472. PROCEDURE MakeLocal (Source: TPoint; Var Dest: TPoint);
  473. PROCEDURE MakeGlobal (Source: TPoint; Var Dest: TPoint);
  474. PROCEDURE WriteStr (X, Y: Integer; Str: String; Color: Byte);
  475. PROCEDURE WriteChar (X, Y: Integer; C: Char; Color: Byte;
  476. Count: Integer);
  477. PROCEDURE DragView (Event: TEvent; Mode: Byte; Var Limits: TRect;
  478. MinSize, MaxSize: TPoint);
  479. FUNCTION FontWidth: Integer;
  480. FUNCTION Fontheight: Integer;
  481. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  482. PROCEDURE CreateWindowNow (CmdShow: Integer); Virtual;
  483. {$ENDIF}
  484. END;
  485. SelectMode = (NormalSelect, EnterSelect, LeaveSelect);
  486. {---------------------------------------------------------------------------}
  487. { TGroup OBJECT - GROUP OBJECT ANCESTOR }
  488. {---------------------------------------------------------------------------}
  489. TGroup = OBJECT (TView)
  490. Phase : (phFocused, phPreProcess, phPostProcess);
  491. EndState: Word; { Modal result }
  492. Current : PView; { Selected subview }
  493. Last : PView; { 1st view inserted }
  494. Buffer : PVideoBuf; { Speed up buffer }
  495. CONSTRUCTOR Init (Var Bounds: TRect);
  496. CONSTRUCTOR Load (Var S: TStream);
  497. DESTRUCTOR Done; Virtual;
  498. FUNCTION First: PView;
  499. FUNCTION Execute: Word; Virtual;
  500. FUNCTION GetHelpCtx: Word; Virtual;
  501. FUNCTION DataSize: Word; Virtual;
  502. FUNCTION ExecView (P: PView): Word; Virtual;
  503. FUNCTION FirstThat (P: Pointer): PView;
  504. FUNCTION Valid (Command: Word): Boolean; Virtual;
  505. FUNCTION FocusNext (Forwards: Boolean): Boolean;
  506. PROCEDURE Draw; Virtual;
  507. PROCEDURE Lock;
  508. PROCEDURE UnLock;
  509. PROCEDURE Awaken; Virtual;
  510. PROCEDURE ReDraw;
  511. PROCEDURE SelectDefaultView;
  512. PROCEDURE Insert (P: PView);
  513. PROCEDURE Delete (P: PView);
  514. PROCEDURE ForEach (P: Pointer); Virtual;
  515. PROCEDURE EndModal (Command: Word); Virtual;
  516. PROCEDURE DisplaceBy (Dx, Dy: Integer); Virtual;
  517. PROCEDURE SelectNext (Forwards: Boolean);
  518. PROCEDURE InsertBefore (P, Target: PView);
  519. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  520. PROCEDURE GetData (Var Rec); Virtual;
  521. PROCEDURE SetData (Var Rec); Virtual;
  522. PROCEDURE Store (Var S: TStream);
  523. PROCEDURE EventError (Var Event: TEvent); Virtual;
  524. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  525. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  526. PROCEDURE GetSubViewPtr (Var S: TStream; Var P);
  527. PROCEDURE PutSubViewPtr (Var S: TStream; P: PView);
  528. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  529. PROCEDURE CreateWindowNow (CmdShow: Integer); Virtual;
  530. {$ENDIF}
  531. PRIVATE
  532. LockFlag: Byte;
  533. Clip : TRect;
  534. FUNCTION IndexOf (P: PView): Integer;
  535. FUNCTION FindNext (Forwards: Boolean): PView;
  536. FUNCTION FirstMatch (AState: Word; AOptions: Word): PView;
  537. PROCEDURE ResetCurrent;
  538. PROCEDURE RemoveView (P: PView);
  539. PROCEDURE InsertView (P, Target: PView);
  540. PROCEDURE SetCurrent (P: PView; Mode: SelectMode);
  541. END;
  542. {---------------------------------------------------------------------------}
  543. { TFrame OBJECT - FRAME VIEW OBJECT }
  544. {---------------------------------------------------------------------------}
  545. TYPE
  546. TFrame = OBJECT (TView)
  547. CONSTRUCTOR Init (Var Bounds: TRect);
  548. FUNCTION GetPalette: PPalette; Virtual;
  549. END;
  550. PFrame = ^TFrame;
  551. {---------------------------------------------------------------------------}
  552. { TScrollBar OBJECT - SCROLL BAR OBJECT }
  553. {---------------------------------------------------------------------------}
  554. TYPE
  555. TScrollChars = Array [0..4] of Char;
  556. TScrollBar = OBJECT (TView)
  557. Value : Integer; { Scrollbar value }
  558. Min : Integer; { Scrollbar minimum }
  559. Max : Integer; { Scrollbar maximum }
  560. PgStep: Integer; { One page step }
  561. ArStep: Integer; { One range step }
  562. Id : Integer; { Scrollbar ID }
  563. CONSTRUCTOR Init (Var Bounds: TRect);
  564. CONSTRUCTOR Load (Var S: TStream);
  565. FUNCTION GetPalette: PPalette; Virtual;
  566. FUNCTION ScrollStep (Part: Integer): Integer; Virtual;
  567. PROCEDURE Draw; Virtual;
  568. PROCEDURE ScrollDraw; Virtual;
  569. PROCEDURE DrawBackGround; Virtual;
  570. PROCEDURE SetValue (AValue: Integer);
  571. PROCEDURE SetRange (AMin, AMax: Integer);
  572. PROCEDURE SetStep (APgStep, AArStep: Integer);
  573. PROCEDURE SetParams (AValue, AMin, AMax, APgStep, AArStep: Integer);
  574. PROCEDURE Store (Var S: TStream);
  575. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  576. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  577. FUNCTION GetClassName: String; Virtual;
  578. FUNCTION GetClassAttr: LongInt; Virtual;
  579. PROCEDURE CreateWindowNow (CmdShow: Integer); Virtual;
  580. {$ENDIF}
  581. PRIVATE
  582. Chars: TScrollChars; { Scrollbar chars }
  583. FUNCTION GetPos: Integer;
  584. FUNCTION GetSize: Integer;
  585. PROCEDURE DrawPos (Pos: Integer);
  586. PROCEDURE ClearPos (Pos: Integer);
  587. END;
  588. PScrollBar = ^TScrollBar;
  589. {---------------------------------------------------------------------------}
  590. { TScroller OBJECT - SCROLLING VIEW ANCESTOR }
  591. {---------------------------------------------------------------------------}
  592. TYPE
  593. TScroller = OBJECT (TView)
  594. Delta : TPoint;
  595. Limit : TPoint;
  596. HScrollBar: PScrollBar; { Horz scroll bar }
  597. VScrollBar: PScrollBar; { Vert scroll bar }
  598. CONSTRUCTOR Init (Var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar);
  599. CONSTRUCTOR Load (Var S: TStream);
  600. FUNCTION GetPalette: PPalette; Virtual;
  601. PROCEDURE ScrollDraw; Virtual;
  602. PROCEDURE SetLimit (X, Y: Integer);
  603. PROCEDURE ScrollTo (X, Y: Integer);
  604. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  605. PROCEDURE Store (Var S: TStream);
  606. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  607. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  608. PRIVATE
  609. DrawFlag: Boolean;
  610. DrawLock: Byte;
  611. PROCEDURE CheckDraw;
  612. END;
  613. PScroller = ^TScroller;
  614. {---------------------------------------------------------------------------}
  615. { TListViewer OBJECT - LIST VIEWER OBJECT }
  616. {---------------------------------------------------------------------------}
  617. TYPE
  618. TListViewer = OBJECT (TView)
  619. NumCols : Integer; { Number of columns }
  620. TopItem : Integer; { Top most item }
  621. Focused : Integer; { Focused item }
  622. Range : Integer; { Range of listview }
  623. HScrollBar: PScrollBar; { Horz scrollbar }
  624. VScrollBar: PScrollBar; { Vert scrollbar }
  625. CONSTRUCTOR Init (Var Bounds: TRect; ANumCols: Word; AHScrollBar,
  626. AVScrollBar: PScrollBar);
  627. CONSTRUCTOR Load (Var S: TStream);
  628. FUNCTION GetPalette: PPalette; Virtual;
  629. FUNCTION IsSelected (Item: Integer): Boolean; Virtual;
  630. FUNCTION GetText (Item: Integer; MaxLen: Integer): String; Virtual;
  631. PROCEDURE DrawFocus; Virtual;
  632. PROCEDURE DrawBackGround; Virtual;
  633. PROCEDURE FocusItem (Item: Integer); Virtual;
  634. PROCEDURE SetTopItem (Item: Integer);
  635. PROCEDURE SetRange (ARange: Integer);
  636. PROCEDURE SelectItem (Item: Integer); Virtual;
  637. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  638. PROCEDURE Store (Var S: TStream);
  639. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  640. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  641. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  642. FUNCTION GetNotifyCmd: LongInt; Virtual;
  643. FUNCTION GetClassName: String; Virtual;
  644. FUNCTION GetClassAttr: LongInt; Virtual;
  645. PROCEDURE CreateWindowNow (CmdShow: Integer); Virtual;
  646. {$ENDIF}
  647. PRIVATE
  648. PROCEDURE FocusItemNum (Item: Integer); Virtual;
  649. END;
  650. PListViewer = ^TListViewer;
  651. {---------------------------------------------------------------------------}
  652. { TWindow OBJECT - WINDOW OBJECT ANCESTOR }
  653. {---------------------------------------------------------------------------}
  654. TYPE
  655. TWindow = OBJECT (TGroup)
  656. Flags : Byte; { Window flags }
  657. Number : Integer; { Window number }
  658. Palette : Integer; { Window palette }
  659. ZoomRect: TRect; { Zoom rectangle }
  660. Frame : PFrame; { Frame view object }
  661. Title : PString; { Title string }
  662. CONSTRUCTOR Init (Var Bounds: TRect; ATitle: TTitleStr; ANumber: Integer);
  663. CONSTRUCTOR Load (Var S: TStream);
  664. DESTRUCTOR Done; Virtual;
  665. FUNCTION GetPalette: PPalette; Virtual;
  666. FUNCTION GetTitle (MaxSize: Integer): TTitleStr; Virtual;
  667. FUNCTION StandardScrollBar (AOptions: Word): PScrollBar;
  668. PROCEDURE Zoom; Virtual;
  669. PROCEDURE Close; Virtual;
  670. PROCEDURE InitFrame; Virtual;
  671. PROCEDURE DrawBorder; Virtual;
  672. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  673. PROCEDURE Store (Var S: TStream);
  674. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  675. PROCEDURE SizeLimits (Var Min, Max: TPoint); Virtual;
  676. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  677. FUNCTION GetClassText: String; Virtual;
  678. FUNCTION GetClassAttr: LongInt; Virtual;
  679. {$ENDIF}
  680. END;
  681. PWindow = ^TWindow;
  682. {***************************************************************************}
  683. { INTERFACE ROUTINES }
  684. {***************************************************************************}
  685. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  686. { WINDOW MESSAGE ROUTINES }
  687. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  688. {-Message------------------------------------------------------------
  689. Message sets up an event record and calls Receiver^.HandleEvent to
  690. handle the event. Message returns nil if Receiver is nil, or if
  691. the event is not handled successfully.
  692. 12Sep97 LdB
  693. ---------------------------------------------------------------------}
  694. FUNCTION Message (Receiver: PView; What, Command: Word;
  695. InfoPtr: Pointer): Pointer;
  696. {-NewMessage---------------------------------------------------------
  697. NewMessage sets up an event record including the new fields and calls
  698. Receiver^.HandleEvent to handle the event. Message returns nil if
  699. Receiver is nil, or if the event is not handled successfully.
  700. 19Sep97 LdB
  701. ---------------------------------------------------------------------}
  702. FUNCTION NewMessage (P: PView; What, Command: Word; Id: Integer; Data: Real;
  703. InfoPtr: Pointer): Pointer;
  704. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  705. { VIEW OBJECT REGISTRATION ROUTINES }
  706. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  707. {-RegisterViews------------------------------------------------------
  708. This registers all the view type objects used in this unit.
  709. 11Aug99 LdB
  710. ---------------------------------------------------------------------}
  711. PROCEDURE RegisterViews;
  712. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  713. { NEW VIEW ROUTINES }
  714. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  715. {-CreateIdScrollBar--------------------------------------------------
  716. Creates and scrollbar object of the given size and direction and sets
  717. the scrollbar id number.
  718. 22Sep97 LdB
  719. ---------------------------------------------------------------------}
  720. FUNCTION CreateIdScrollBar (X, Y, Size, Id: Integer; Horz: Boolean): PScrollBar;
  721. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  722. { NEW WIN/NT/OS2 VERSION SPECIFIC INTERFACE ROUTINES }
  723. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  724. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  725. {-TvViewMsgHandler---------------------------------------------------
  726. This is the default WIN/NT handler for TView objects. Descendant
  727. objects may need to call back to this handler so it must be provided
  728. on the interface.
  729. 11Aug99 LdB
  730. ---------------------------------------------------------------------}
  731. FUNCTION TvViewMsgHandler (Wnd: hWnd; iMessage, wParam: Sw_Word;
  732. lParam: LongInt): LongInt;
  733. {$IFDEF BIT_16} EXPORT; {$ENDIF}
  734. {$IFDEF BIT_32} {$IFDEF PPC_SPEED} CDECL; {$ELSE} STDCALL; {$ENDIF} {$ENDIF}
  735. {$ENDIF}
  736. {$IFDEF OS_OS2} { OS2 CODE }
  737. {-TvViewMsgHandler---------------------------------------------------
  738. This is the default OS2 handler for TView objects. Descendant objects
  739. may need to call back to this handler so it must be provided on the
  740. interface.
  741. 11Aug99 LdB
  742. ---------------------------------------------------------------------}
  743. FUNCTION TvViewMsgHandler(Wnd: HWnd; Msg: ULong; Mp1, Mp2: MParam): MResult;
  744. CDECL; EXPORT;
  745. {$ENDIF}
  746. {***************************************************************************}
  747. { INITIALIZED PUBLIC VARIABLES }
  748. {***************************************************************************}
  749. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  750. {$IFDEF PPC_FPC} { FPC WINDOWS COMPILER }
  751. TYPE TColorRef = LongInt; { TColorRef defined }
  752. {$ENDIF}
  753. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  754. TYPE TColorRef = LongInt; { TColorRef defined }
  755. TPaintStruct = PaintStruct;
  756. TWindowPos = WindowPos;
  757. TSize = Size;
  758. TWndClass = WndClass;
  759. {$ENDIF}
  760. {---------------------------------------------------------------------------}
  761. { INITIALIZED WIN/NT VARIABLES }
  762. {---------------------------------------------------------------------------}
  763. CONST
  764. ColRef: Array [0..15] Of TColorRef = { Standard colour refs }
  765. (rgb_Black, rgb_Blue, rgb_Green, rgb_Cyan,
  766. rgb_Red, rgb_Magenta, rgb_Brown, rgb_LightGray,
  767. rgb_DarkGray, rgb_LightBlue, rgb_LightGreen,
  768. rgb_LightCyan, rgb_LightRed, rgb_LightMagenta,
  769. rgb_Yellow, rgb_White);
  770. ColBrush: Array [0..15] Of HBrush =
  771. (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  772. ColPen: Array [0..15] Of HPen =
  773. (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  774. {$ENDIF}
  775. {$IFDEF OS_OS2} { OS2 CODE }
  776. {---------------------------------------------------------------------------}
  777. { INITIALIZED OS2 VARIABLES }
  778. {---------------------------------------------------------------------------}
  779. CONST
  780. ColRef: Array [0..15] Of LongInt =
  781. (clr_Black, clr_DarkBlue, clr_DarkGreen, clr_DarkCyan,
  782. clr_DarkRed, clr_DarkPink, clr_Brown, clr_PaleGray,
  783. clr_DarkGray, clr_Blue, clr_Green, clr_Cyan,
  784. clr_Red, clr_Pink, clr_Yellow, clr_White);
  785. {$ENDIF}
  786. {---------------------------------------------------------------------------}
  787. { INITIALIZED DOS/DPMI/WIN/NT/OS2 VARIABLES }
  788. {---------------------------------------------------------------------------}
  789. CONST
  790. UseNativeClasses: Boolean = True; { Native class modes }
  791. CommandSetChanged: Boolean = False; { Command change flag }
  792. ShowMarkers: Boolean = False; { Show marker state }
  793. ErrorAttr: Byte = $CF; { Error colours }
  794. PositionalEvents: Word = evMouse; { Positional defined }
  795. FocusedEvents: Word = evKeyboard + evCommand; { Focus defined }
  796. MinWinSize: TPoint = (X: 16; Y: 6); { Minimum window size }
  797. ShadowSize: TPoint = (X: 2; Y: 1); { Shadow sizes }
  798. ShadowAttr: Byte = $08; { Shadow attribute }
  799. { Characters used for drawing selected and default items in }
  800. { monochrome color sets }
  801. SpecialChars: Array [0..5] Of Char = (#175, #174, #26, #27, ' ', ' ');
  802. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  803. { STREAM REGISTRATION RECORDS }
  804. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  805. {---------------------------------------------------------------------------}
  806. { TView STREAM REGISTRATION }
  807. {---------------------------------------------------------------------------}
  808. CONST
  809. RView: TStreamRec = (
  810. ObjType: 1; { Register id = 1 }
  811. {$IFDEF BP_VMTLink}
  812. VmtLink: Ofs(TypeOf(TView)^); { BP style VMT link }
  813. {$ELSE}
  814. VmtLink: TypeOf(TView); { Alt style VMT link }
  815. {$ENDIF}
  816. Load: @TView.Load; { Object load method }
  817. Store: @TView.Store { Object store method }
  818. );
  819. {---------------------------------------------------------------------------}
  820. { TFrame STREAM REGISTRATION }
  821. {---------------------------------------------------------------------------}
  822. CONST
  823. RFrame: TStreamRec = (
  824. ObjType: 2; { Register id = 2 }
  825. {$IFDEF BP_VMTLink}
  826. VmtLink: Ofs(TypeOf(TFrame)^); { BP style VMT link }
  827. {$ELSE}
  828. VmtLink: TypeOf(TFrame); { Alt style VMT link }
  829. {$ENDIF}
  830. Load: @TFrame.Load; { Frame load method }
  831. Store: @TFrame.Store { Frame store method }
  832. );
  833. {---------------------------------------------------------------------------}
  834. { TScrollBar STREAM REGISTRATION }
  835. {---------------------------------------------------------------------------}
  836. CONST
  837. RScrollBar: TStreamRec = (
  838. ObjType: 3; { Register id = 3 }
  839. {$IFDEF BP_VMTLink}
  840. VmtLink: Ofs(TypeOf(TScrollBar)^); { BP style VMT link }
  841. {$ELSE}
  842. VmtLink: TypeOf(TScrollBar); { Alt style VMT link }
  843. {$ENDIF}
  844. Load: @TScrollBar.Load; { Object load method }
  845. Store: @TScrollBar.Store { Object store method }
  846. );
  847. {---------------------------------------------------------------------------}
  848. { TScroller STREAM REGISTRATION }
  849. {---------------------------------------------------------------------------}
  850. CONST
  851. RScroller: TStreamRec = (
  852. ObjType: 4; { Register id = 4 }
  853. {$IFDEF BP_VMTLink}
  854. VmtLink: Ofs(TypeOf(TScroller)^); { BP style VMT link }
  855. {$ELSE}
  856. VmtLink: TypeOf(TScroller); { Alt style VMT link }
  857. {$ENDIF}
  858. Load: @TScroller.Load; { Object load method }
  859. Store: @TScroller.Store { Object store method }
  860. );
  861. {---------------------------------------------------------------------------}
  862. { TListViewer STREAM REGISTRATION }
  863. {---------------------------------------------------------------------------}
  864. CONST
  865. RListViewer: TStreamRec = (
  866. ObjType: 5; { Register id = 5 }
  867. {$IFDEF BP_VMTLink}
  868. VmtLink: Ofs(TypeOf(TListViewer)^); { BP style VMT link }
  869. {$ELSE}
  870. VmtLink: TypeOf(TListViewer); { Alt style VMT link }
  871. {$ENDIF}
  872. Load: @TListViewer.Load; { Object load method }
  873. Store: @TLIstViewer.Store { Object store method }
  874. );
  875. {---------------------------------------------------------------------------}
  876. { TGroup STREAM REGISTRATION }
  877. {---------------------------------------------------------------------------}
  878. CONST
  879. RGroup: TStreamRec = (
  880. ObjType: 6; { Register id = 6 }
  881. {$IFDEF BP_VMTLink}
  882. VmtLink: Ofs(TypeOf(TGroup)^); { BP style VMT link }
  883. {$ELSE}
  884. VmtLink: TypeOf(TGroup); { Alt style VMT link }
  885. {$ENDIF}
  886. Load: @TGroup.Load; { Object load method }
  887. Store: @TGroup.Store { Object store method }
  888. );
  889. {---------------------------------------------------------------------------}
  890. { TWindow STREAM REGISTRATION }
  891. {---------------------------------------------------------------------------}
  892. CONST
  893. RWindow: TStreamRec = (
  894. ObjType: 7; { Register id = 7 }
  895. {$IFDEF BP_VMTLink}
  896. VmtLink: Ofs(TypeOf(TWindow)^); { BP style VMT link }
  897. {$ELSE}
  898. VmtLink: TypeOf(TWindow); { Alt style VMT link }
  899. {$ENDIF}
  900. Load: @TWindow.Load; { Object load method }
  901. Store: @TWindow.Store { Object store method }
  902. );
  903. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  904. IMPLEMENTATION
  905. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  906. {***************************************************************************}
  907. { PRIVATE CONSTANT DEFINITIONS }
  908. {***************************************************************************}
  909. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  910. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  911. CONST WM_Notify = $004E; { Value was left out }
  912. {$ENDIF}
  913. {$ENDIF}
  914. {***************************************************************************}
  915. { PRIVATE TYPE DEFINITIONS }
  916. {***************************************************************************}
  917. {---------------------------------------------------------------------------}
  918. { TFixupList DEFINITION }
  919. {---------------------------------------------------------------------------}
  920. TYPE
  921. TFixupList = ARRAY [1..4096] Of Pointer; { Fix up ptr array }
  922. PFixupList = ^TFixupList; { Ptr to fix up list }
  923. {***************************************************************************}
  924. { PRIVATE INITIALIZED VARIABLES }
  925. {***************************************************************************}
  926. {---------------------------------------------------------------------------}
  927. { INITIALIZED DOS/DPMI/WIN/NT/OS2 PRIVATE VARIABLES }
  928. {---------------------------------------------------------------------------}
  929. CONST
  930. TheTopView : PView = Nil; { Top focused view }
  931. LimitsLocked: PView = Nil; { View locking limits }
  932. OwnerGroup : PGroup = Nil; { Used for loading }
  933. FixupList : PFixupList = Nil; { Used for loading }
  934. CurCommandSet: TCommandSet = ([0..255] -
  935. [cmZoom, cmClose, cmResize, cmNext, cmPrev]); { All active but these }
  936. {***************************************************************************}
  937. { PRIVATE INTERNAL ROUTINES }
  938. {***************************************************************************}
  939. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  940. {---------------------------------------------------------------------------}
  941. { TvViewMsgHandler -> Platforms WIN/NT - Updated 09Aug99 LdB }
  942. {---------------------------------------------------------------------------}
  943. FUNCTION TvViewMsgHandler (Wnd: hWnd; iMessage, wParam: Sw_Word;
  944. lParam: LongInt): LongInt; {$IFDEF PPC_FPC} STDCALL; {$ENDIF}
  945. VAR Bc: Byte; I: LongInt; W: Word; Event: TEvent; P, Tp: PView;
  946. Q: PScrollBar; Ps: TPaintStruct; Wp: ^TWindowPos;
  947. BEGIN
  948. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  949. PtrRec(P).Seg := GetProp(Wnd, ViewSeg); { Fetch seg property }
  950. PtrRec(P).Ofs := GetProp(Wnd, ViewOfs); { Fetch ofs property }
  951. {$ENDIF}
  952. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  953. LongInt(P) := GetProp(Wnd, ViewPtr); { Fetch view pointer }
  954. {$ENDIF}
  955. If (P <> Nil) Then Begin { Valid view pointer }
  956. TvViewMsgHandler := 0; { Preset return zero }
  957. Event.What := evNothing; { Preset no event }
  958. Case iMessage Of
  959. WM_Close: Begin { CLOSE COMMAND }
  960. If (P^.GetState(sfFocused) = False) Then
  961. P^.FocusFromTop; { Focus if behind }
  962. Event.What := evCommand; { Command event }
  963. Event.Command := cmClose; { Quit command }
  964. Event.InfoPtr := P; { Pointer to view }
  965. End;
  966. WM_LButtonDown: Begin { LEFT MOUSE DOWN }
  967. Event.What := evMouseDown; { Mouse down event }
  968. Event.Double := False; { Not double click }
  969. MouseButtons := MouseButtons OR mbLeftButton;{ Set button mask }
  970. End;
  971. WM_LButtonUp: Begin { LEFT MOUSE UP }
  972. Event.What := evMouseUp; { Mouse up event }
  973. Event.Double := False; { Not double click }
  974. MouseButtons := MouseButtons AND NOT
  975. mbLeftButton; { Clear button mask }
  976. End;
  977. WM_LButtonDBLClk: Begin { LEFT MOUSE DBL CLK }
  978. Event.What := evMouseDown; { Mouse down event }
  979. Event.Double := True; { Double click }
  980. MouseButtons := MouseButtons OR mbLeftButton;{ Set button mask }
  981. End;
  982. WM_RButtonDown: Begin { RIGHT MOUSE DOWN }
  983. Event.What := evMouseDown; { Mouse down event }
  984. Event.Double := False; { Not double click }
  985. MouseButtons := MouseButtons OR
  986. mbRightButton; { Set button mask }
  987. End;
  988. WM_RButtonUp: Begin { RIGHT MOUSE UP }
  989. Event.What := evMouseUp; { Mouse up event }
  990. Event.Double := False; { Not double click }
  991. MouseButtons := MouseButtons AND NOT
  992. mbRightButton; { Clear button mask }
  993. End;
  994. WM_RButtonDBLClk: Begin { RIGHT MOUSE DBL CLK }
  995. Event.What := evMouseDown; { Mouse down event }
  996. Event.Double := True; { Double click }
  997. MouseButtons := MouseButtons OR
  998. mbLeftButton; { Set button mask }
  999. End;
  1000. WM_MButtonDown: Begin { MIDDLE MOUSE DOWN }
  1001. Event.What := evMouseDown; { Mouse down event }
  1002. Event.Double := False; { Not double click }
  1003. MouseButtons := MouseButtons OR
  1004. mbMiddleButton; { Set button mask }
  1005. End;
  1006. WM_MButtonUp: Begin { MIDDLE MOUSE UP }
  1007. Event.What := evMouseUp; { Mouse up event }
  1008. Event.Double := False; { Not double click }
  1009. MouseButtons := MouseButtons AND NOT
  1010. mbMiddleButton; { Clear button mask }
  1011. End;
  1012. WM_MButtonDBLClk: Begin { MIDDLE MOUSE DBL CLK }
  1013. Event.What := evMouseDown; { Mouse down event }
  1014. Event.Double := True; { Double click }
  1015. MouseButtons := MouseButtons OR
  1016. mbMiddleButton; { Set button mask }
  1017. End;
  1018. WM_MouseMove: Begin { MOUSE MOVEMENT }
  1019. Event.What := evMouseMove; { Mouse move event }
  1020. Event.Double := False; { Not double click }
  1021. MouseButtons := 0; { Preset clear buttons }
  1022. If (wParam AND mk_LButton <> 0) Then
  1023. MouseButtons := MouseButtons OR
  1024. mbLeftButton; { Left button mask }
  1025. If (wParam AND mk_MButton <> 0) Then
  1026. MouseButtons := MouseButtons OR
  1027. mbLeftButton; { Middle button mask }
  1028. If (wParam AND mk_RButton <> 0) Then
  1029. MouseButtons := MouseButtons OR
  1030. mbRightButton; { Set right button mask }
  1031. End;
  1032. {$IFDEF BIT_32}
  1033. WM_Notify: Begin
  1034. I := 0;
  1035. End;
  1036. {$ENDIF}
  1037. WM_EraseBkGnd: TvViewMsgHandler := 1; { BACKGROUND MESSAGE }
  1038. WM_Paint: If (P^.Dc = 0) Then Begin { PAINT MESSAGE }
  1039. P^.Dc := BeginPaint(Wnd, Ps); { Fetch structure }
  1040. SelectObject(ps.hDC, DefGFVFont); { Select default font }
  1041. P^.DrawMask := P^.DrawMask OR vdNoChild; { Draw this view only }
  1042. P^.ReDrawArea(Ps.rcPaint.Left + P^.RawOrigin.X,
  1043. Ps.rcPaint.Top + P^.RawOrigin.Y,
  1044. Ps.rcPaint.Right + P^.RawOrigin.X-1,
  1045. Ps.rcPaint.Bottom + P^.RawOrigin.Y-1); { Redraw the area }
  1046. P^.DrawMask := P^.DrawMask AND NOT vdNoChild;{ Child draws enabled }
  1047. P^.Dc := 0; { Zero device context }
  1048. EndPaint(Wnd, Ps); { End painting }
  1049. End Else PostMessage(Wnd, iMessage, wParam,
  1050. lParam); { Busy repost message }
  1051. WM_HScroll, WM_VScroll: Begin { SCROLLBAR MESSAGES }
  1052. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1053. PtrRec(Q).Seg := GetProp(HiWord(lParam),
  1054. ViewSeg); { Fetch seg property }
  1055. PtrRec(Q).Ofs := GetProp(HiWord(lParam),
  1056. ViewOfs); { Fetch ofs property }
  1057. W := wParam; { Transfer word }
  1058. {$ENDIF}
  1059. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1060. LongInt(Q) := GetProp(lParam, ViewPtr); { Fetch seg property }
  1061. W := LoWord(wParam); { Low param part }
  1062. {$ENDIF}
  1063. If (Q <> Nil) Then Begin { Valid scrollbar }
  1064. If (Q^.GetState(sfFocused) = False) Then
  1065. Q^.FocusFromTop; { Focus up to us }
  1066. Bc := 0; { Preset do call }
  1067. Case W Of
  1068. SB_TOP: Q^.SetValue(Q^.Min); { Set to minimum }
  1069. SB_BOTTOM: Q^.SetValue(Q^.Max); { Set to maximum }
  1070. SB_ENDSCROLL: Bc := 1; { Fail this call }
  1071. SB_LINEDOWN: Q^.SetValue(Q^.Value +
  1072. Q^.ScrollStep(sbDownArrow)); { One line down }
  1073. SB_LINEUP: Q^.SetValue(Q^.Value +
  1074. Q^.ScrollStep(sbUpArrow)); { One line up }
  1075. SB_PAGEDOWN: Q^.SetValue(Q^.Value +
  1076. Q^.ScrollStep(sbPageDown)); { One page down }
  1077. SB_PAGEUP: Q^.SetValue(Q^.Value +
  1078. Q^.ScrollStep(sbPageUp)); { One page up }
  1079. SB_THUMBPOSITION, SB_THUMBTRACK:
  1080. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1081. Q^.SetValue(LoWord(lParam)); { Set to position }
  1082. {$ENDIF}
  1083. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1084. Q^.SetValue(HiWord(wParam)); { Set to position }
  1085. {$ENDIF}
  1086. Else Bc := 1; { Fail other cases }
  1087. End;
  1088. If (Bc=0) Then NewMessage(Q^.Owner,
  1089. evBroadcast, cmScrollBarClicked, Q^.Id,
  1090. Q^.Value, Q); { Old TV style message }
  1091. End;
  1092. End;
  1093. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1094. WM_CtlColor: If (HiWord(lParam) = CtlColor_Btn){ COLOUR CONTROL }
  1095. OR (HiWord(lParam) = CtlColor_ListBox)
  1096. {$ENDIF}
  1097. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1098. WM_CtlColorListBox, WM_CtlColorBtn: { COLOUR LISTBOX/BUTTON }
  1099. If (lParam <> 0) { Valid handle }
  1100. {$ENDIF}
  1101. Then Begin
  1102. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1103. PtrRec(P).Seg := GetProp(LoWord(lParam),
  1104. ViewSeg); { Get view segment }
  1105. PtrRec(P).Ofs := GetProp(LoWord(lParam),
  1106. ViewOfs); { Get view segment }
  1107. {$ENDIF}
  1108. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1109. LongInt(P) := GetProp(LoWord(lParam),
  1110. ViewPtr); { Get view pointer }
  1111. {$ENDIF}
  1112. If (P <> Nil) Then Begin { Valid view }
  1113. Bc := P^.GetColor(1) AND $F0 SHR 4; { Background colour }
  1114. SetTextColor(wParam, ColRef[P^.GetColor(1)
  1115. AND $0F]); { Set text colour }
  1116. SetBkColor(wParam, ColRef[Bc]); { Set background colour }
  1117. TvViewMsgHandler := ColBrush[Bc]; { Return colour brush }
  1118. End Else TvViewMsgHandler := DefWindowProc(
  1119. Wnd, iMessage, wParam, lParam); { Call default handler }
  1120. End Else TvViewMsgHandler := DefWindowProc(
  1121. Wnd, iMessage, wParam, lParam); { Call default handler }
  1122. WM_SysCommand: Begin { SYSTEM COMMAND MESSAGE }
  1123. If (P^.GetState(sfFocused) = False) Then
  1124. P^.FocusFromTop; { Focus if behind }
  1125. TvViewMsgHandler := DefWindowProc(
  1126. Wnd, iMessage, wParam, lParam);
  1127. If IsIconic(Wnd) Then BringWindowToTop(Wnd);
  1128. End;
  1129. WM_Command: Begin { COMMAND MESSAGE }
  1130. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1131. W := HiWord(lParam); { Message of lParam }
  1132. {$ENDIF}
  1133. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1134. W := HiWord(wParam); { Handle high of wParam }
  1135. {$ENDIF}
  1136. Case W Of
  1137. cbn_SelChange: Begin { COMBO/LIST SELECTION }
  1138. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1139. PtrRec(Tp).Seg := GetProp(LoWord(lParam),
  1140. ViewSeg); { Fetch combo seg }
  1141. PtrRec(Tp).Ofs := GetProp(LoWord(lParam),
  1142. ViewOfs); { Fetch combo ofs }
  1143. {$ENDIF}
  1144. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1145. LongInt(Tp) := GetProp(LoWord(lParam),
  1146. ViewPtr); { Fetch combo ptr }
  1147. {$ENDIF}
  1148. If (Tp <> Nil) Then Begin { View is valid }
  1149. I := SendMessage(LoWord(lParam),
  1150. Tp^.GetNotifyCmd, 0, 0); { Get current state }
  1151. Event.What := evCommand; { Command event }
  1152. Event.Command := cmNotify; { Notify command }
  1153. Event.data := I; { Load data value }
  1154. Event.InfoPtr := Tp; { Pointer to view }
  1155. End;
  1156. End;
  1157. cbn_SetFocus: Begin { DROP BOX FOCUSED }
  1158. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1159. PtrRec(Tp).Seg := GetProp(LoWord(lParam),
  1160. ViewSeg); { Fetch combo seg }
  1161. PtrRec(Tp).Ofs := GetProp(LoWord(lParam),
  1162. ViewOfs); { Fetch combo ofs }
  1163. {$ENDIF}
  1164. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1165. LongInt(Tp) := GetProp(LoWord(lParam),
  1166. ViewPtr); { Fetch combo ptr }
  1167. {$ENDIF}
  1168. If (Tp <> Nil) AND { Combo box valid }
  1169. (Tp^.GetState(sfFocused) = False) Then { We have not focus }
  1170. Tp^.FocusFromTop; { Focus up to us }
  1171. End;
  1172. lbn_SetFocus: Begin { LIST BOX FOCUSED }
  1173. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  1174. PtrRec(Tp).Seg := GetProp(LoWord(lParam),
  1175. ViewSeg); { Fetch listbox seg }
  1176. PtrRec(Tp).Ofs := GetProp(LoWord(lParam),
  1177. ViewOfs); { Fetch listbox ofs }
  1178. {$ENDIF}
  1179. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  1180. LongInt(Tp) := GetProp(LoWord(lParam),
  1181. ViewPtr); { Fetch listbox ptr }
  1182. {$ENDIF}
  1183. If (Tp <> Nil) Then Begin { Listbox is valid }
  1184. If (Tp^.GetState(sfFocused) = False) { We have not focus }
  1185. Then Tp^.FocusFromTop; { Focus up to us }
  1186. End;
  1187. End;
  1188. Else TvViewMsgHandler := DefWindowProc(
  1189. Wnd, iMessage, wParam, lParam); { Call default handler }
  1190. End;
  1191. End;
  1192. WM_Activate, WM_ChildActivate: Begin
  1193. If (P^.Options AND ofTopSelect <> 0) { Top selectable view }
  1194. AND (P^.Options AND ofSelectable <> 0) { View is selectable }
  1195. Then P^.FocusFromTop; { Focus us from top }
  1196. End;
  1197. WM_WindowPosChanged: Begin { WINDOW HAS MOVED }
  1198. If (NOT ISIconic(Wnd)) AND (lParam <> 0) { Window not iconic }
  1199. Then Begin
  1200. Wp := Pointer(lParam); { TWindowpos structure }
  1201. If (Wp^.Flags AND swp_NoMove = 0) { No move flag is clear }
  1202. Then Begin
  1203. If (P^.Owner <> Nil) Then
  1204. P^.DisplaceBy(Wp^.X + P^.Owner^.RawOrigin.X -
  1205. P^.RawOrigin.X + P^.Owner^.FrameSize,
  1206. Wp^.Y + P^.Owner^.RawOrigin.Y -
  1207. P^.RawOrigin.Y + P^.Owner^.CaptSize) { Displace the window }
  1208. Else P^.DisplaceBy(Wp^.X + P^.RawOrigin.X,
  1209. Wp^.Y - P^.RawOrigin.Y); { Displace the window }
  1210. End;
  1211. If (Wp^.Flags AND swp_NoSize = 0) { No resize flag clear }
  1212. Then Begin
  1213. P^.RawSize.X := Wp^.Cx; { Size the window x }
  1214. P^.RawSize.Y := Wp^.Cy; { Size the window y }
  1215. End;
  1216. End;
  1217. TvViewMsgHandler := DefWindowProc(Wnd,
  1218. iMessage, wParam, lParam); { Default handler }
  1219. End;
  1220. Else TvViewMsgHandler := DefWindowProc(Wnd,
  1221. iMessage, wParam, lParam); { Call Default handler }
  1222. End; { End of case }
  1223. If (Event.What <> evNothing) Then Begin { Check any GFV event }
  1224. If (Event.What AND evMouse <> 0) Then Begin { Mouse event }
  1225. If (P <> Nil) Then Begin { Valid view pointer }
  1226. Event.Where.X := LoWord(lParam) +
  1227. P^.RawOrigin.X + P^.FrameSize; { X mouse co-ordinate }
  1228. Event.Where.Y := HiWord(lParam) +
  1229. P^.RawOrigin.Y + P^.CaptSize; { Y mouse co-ordinate }
  1230. MouseWhere := Event.Where; { Update mouse where }
  1231. Event.Buttons := MouseButtons; { Return mouse buttons }
  1232. End Else Exit; { View is not valid }
  1233. End;
  1234. PutEventInQueue(Event); { Put event in queue }
  1235. End;
  1236. End Else TvViewMsgHandler := DefWindowProc(Wnd,
  1237. iMessage, wParam, lParam); { Call Default handler }
  1238. END;
  1239. {$ENDIF}
  1240. {$IFDEF OS_OS2} { OS2 CODE }
  1241. {---------------------------------------------------------------------------}
  1242. { TvViewMsgHandler -> Platforms OS2 - Updated 09Aug99 LdB }
  1243. {---------------------------------------------------------------------------}
  1244. FUNCTION TvViewMsgHandler(Wnd: HWnd; Msg: ULong; Mp1, Mp2: MParam): MResult;
  1245. VAR Bc: Byte; R: RectL; Event: TEvent; P: PView; Pt: PointL; PS: hPs; Sp: Swp;
  1246. Q: PScrollBar; Sh: HWnd;
  1247. BEGIN
  1248. P := Nil; { Clear the pointer }
  1249. WinQueryPresParam(Wnd, PP_User, 0, Nil,
  1250. SizeOf(Pointer), @P, 0); { Fetch view pointer }
  1251. If (P <> Nil) Then Begin { PView is valid }
  1252. TvViewMSgHandler := 0; { Preset handled }
  1253. Event.What := evNothing; { Preset no event }
  1254. Case Msg Of
  1255. WM_Close: Begin { CLOSE COMMAND }
  1256. If (P^.GetState(sfFocused) = False) Then
  1257. P^.FocusFromTop; { Focus if behind }
  1258. Event.What := evCommand; { Command event }
  1259. Event.Command := cmClose; { Quit command }
  1260. Event.InfoPtr := P; { Pointer to view }
  1261. End;
  1262. WM_EraseBackGround: TvViewMsgHandler := { BACKGROUND ERASE }
  1263. LongInt(False); { Return false }
  1264. WM_Paint: If (P^.Ps = 0) Then Begin { PAINT MESSAGE }
  1265. P^.Ps := WinBeginPaint(Wnd, 0, @R); { Fetch structure }
  1266. P^.DrawMask := P^.DrawMask OR vdNoChild; { Draw this view only }
  1267. P^.ReDrawArea(R.xLeft + P^.RawOrigin.X,
  1268. R.yBottom + P^.RawOrigin.Y,
  1269. R.xRight + P^.RawOrigin.X,
  1270. R.yTop + P^.RawOrigin.Y); { Redraw the area }
  1271. P^.DrawMask := P^.DrawMask AND NOT vdNoChild;{ Child draws enabled }
  1272. P^.Ps := 0; { Zero device context }
  1273. WinEndPaint(Ps); { End painting }
  1274. End Else WinPostMsg(Wnd, Msg, Mp1, Mp2); { Busy repost message }
  1275. WM_Button1Down: Begin { LEFT MOUSE DOWN }
  1276. Event.What := evMouseDown; { Mouse down event }
  1277. Event.Double := False; { Not double click }
  1278. MouseButtons := MouseButtons OR
  1279. mbLeftButton; { Set button mask }
  1280. End;
  1281. WM_Button1Up: Begin { LEFT MOUSE UP }
  1282. Event.What := evMouseUp; { Mouse up event }
  1283. Event.Double := False; { Not double click }
  1284. MouseButtons := MouseButtons AND NOT
  1285. mbLeftButton; { Clear button mask }
  1286. End;
  1287. WM_Button1DBLClk: Begin { LEFT MOUSE DBL CLK }
  1288. Event.What := evMouseDown; { Mouse down event }
  1289. Event.Double := True; { Double click }
  1290. MouseButtons := MouseButtons OR
  1291. mbLeftButton; { Set button mask }
  1292. End;
  1293. WM_Button2Down: Begin { RIGHT MOUSE DOWN }
  1294. Event.What := evMouseDown; { Mouse down event }
  1295. Event.Double := False; { Not double click }
  1296. MouseButtons := MouseButtons OR
  1297. mbRightButton; { Set button mask }
  1298. End;
  1299. WM_Button2Up: Begin { RIGHT MOUSE UP }
  1300. Event.What := evMouseUp; { Mouse up event }
  1301. Event.Double := False; { Not double click }
  1302. MouseButtons := MouseButtons AND NOT
  1303. mbRightButton; { Clear button mask }
  1304. End;
  1305. WM_Button2DBLClk: Begin { RIGHT MOUSE DBL CLK }
  1306. Event.What := evMouseDown; { Mouse down event }
  1307. Event.Double := True; { Double click }
  1308. MouseButtons := MouseButtons OR
  1309. mbLeftButton; { Set button mask }
  1310. End;
  1311. WM_Button3Down: Begin { MIDDLE MOUSE DOWN }
  1312. Event.What := evMouseDown; { Mouse down event }
  1313. Event.Double := False; { Not double click }
  1314. MouseButtons := MouseButtons OR
  1315. mbMiddleButton; { Set button mask }
  1316. End;
  1317. WM_Button3Up: Begin { MIDDLE MOUSE UP }
  1318. Event.What := evMouseUp; { Mouse up event }
  1319. Event.Double := False; { Not double click }
  1320. MouseButtons := MouseButtons AND NOT
  1321. mbMiddleButton; { Clear button mask }
  1322. End;
  1323. WM_Button3DBLClk: Begin { MIDDLE MOUSE DBL CLK }
  1324. Event.What := evMouseDown; { Mouse down event }
  1325. Event.Double := True; { Double click }
  1326. MouseButtons := MouseButtons OR
  1327. mbMiddleButton; { Set button mask }
  1328. End;
  1329. WM_MouseMove: Begin { MOUSE MOVEMENT }
  1330. Event.What := evMouseMove; { Mouse move event }
  1331. Event.Double := False; { Not double click }
  1332. If (WinQueryPointer(HWND_Desktop) <>
  1333. DefPointer) Then { Check mouse ptr }
  1334. WinSetPointer(HWND_DeskTop, DefPointer); { Set mouse ptr }
  1335. End;
  1336. WM_HScroll, WM_VScroll: Begin { SCROLLBAR MESSAGES }
  1337. Q := Nil; { Clear the pointer }
  1338. Sh := WinQueryFocus(HWnd_DeskTop); { Scrollbar has focus }
  1339. If (Sh <> 0) Then WinQueryPresParam(Sh,
  1340. PP_User, 0, Nil, SizeOf(Pointer), @Q, 0); { Fetch scrollbar ptr }
  1341. If (Q <> Nil) AND (Q^.GOptions AND
  1342. goNativeClass <> 0) Then Begin { Valid scrollbar }
  1343. If (Q^.GetState(sfFocused) = False) Then
  1344. Q^.FocusFromTop; { Focus up to us }
  1345. Bc := 0; { Preset do call }
  1346. Case Short2FromMP(Mp2) Of { Scrollbar message }
  1347. SB_ENDSCROLL:;
  1348. SB_LINEDOWN: Q^.SetValue(Q^.Value +
  1349. Q^.ScrollStep(sbDownArrow)); { One line down }
  1350. SB_LINEUP: Q^.SetValue(Q^.Value +
  1351. Q^.ScrollStep(sbUpArrow)); { One line up }
  1352. SB_PAGEDOWN: Q^.SetValue(Q^.Value +
  1353. Q^.ScrollStep(sbPageDown)); { One page down }
  1354. SB_PAGEUP: Q^.SetValue(Q^.Value +
  1355. Q^.ScrollStep(sbPageUp)); { One page up }
  1356. SB_SLIDERPOSITION, SB_SLIDERTRACK:
  1357. Q^.SetValue(Short1FromMP(Mp2)); { Set to position }
  1358. Else Bc := 1; { Fail other cases }
  1359. End;
  1360. If (Bc=0) Then NewMessage(Q^.Owner,
  1361. evBroadcast, cmScrollBarClicked, Q^.Id,
  1362. Q^.Value, Q); { Old TV style message }
  1363. End;
  1364. End;
  1365. WM_QueryTrackInfo: Begin { WINDOW HAS MOVED }
  1366. (*If (NOT ISIconic(Wnd)) AND (lParam <> 0) { Window not iconic }
  1367. Then Begin*)
  1368. (*Sp := PSwp(Mp1)^; { New SWP data }
  1369. If (Sp.Fl AND swp_Size <> 0) Then Begin { Size change request }
  1370. P^.RawSize.X := Sp.Cx-1; { Size the window x }
  1371. P^.RawSize.Y := Sp.Cy-1; { Size the window y }
  1372. End;*)
  1373. (*P^.DisplaceBy(Sp1.X - Sp2.X,
  1374. -(Sp1.Y - Sp2.Y));*)
  1375. TvViewMSgHandler := 0;
  1376. End;
  1377. Else TvViewMSgHandler := WinDefWindowProc(
  1378. Wnd, Msg, Mp1, Mp2); { Call default handler }
  1379. End;
  1380. If (Event.What <> evNothing) Then Begin { Check any FV event }
  1381. If (Event.What AND evMouse <> 0) Then Begin { Mouse event }
  1382. WinQueryWindowPos(Wnd, Sp); { Query client area }
  1383. Event.Where.X := Short1FromMP(Mp1)-1
  1384. + P^.RawOrigin.X; { X mouse co-ordinate }
  1385. Event.Where.Y := Sp.Cy -
  1386. Short2FromMP(Mp1)-1 + P^.RawOrigin.Y; { Y mouse co-ordinate }
  1387. Event.Buttons := MouseButtons; { Return buttons }
  1388. MouseWhere := Event.Where; { Update mouse where }
  1389. End;
  1390. PutEventInQueue(Event); { Put event in queue }
  1391. End;
  1392. End Else TvViewMSgHandler := WinDefWindowProc(Wnd,
  1393. Msg, Mp1, Mp2); { Call default handler }
  1394. END;
  1395. {$ENDIF}
  1396. {***************************************************************************}
  1397. { OBJECT METHODS }
  1398. {***************************************************************************}
  1399. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1400. { TView OBJECT METHODS }
  1401. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1402. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  1403. {---------------------------------------------------------------------------}
  1404. { TView WINDOW CLASS NAME CONSTANT }
  1405. {---------------------------------------------------------------------------}
  1406. CONST TvViewClassName = 'TVIEW'; { TView window class }
  1407. {$ENDIF}
  1408. {--TView--------------------------------------------------------------------}
  1409. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Jun96 LdB }
  1410. {---------------------------------------------------------------------------}
  1411. CONSTRUCTOR TView.Init (Var Bounds: TRect);
  1412. BEGIN
  1413. Inherited Init; { Call ancestor }
  1414. DragMode := dmLimitLoY; { Default drag mode }
  1415. HelpCtx := hcNoContext; { Clear help context }
  1416. State := sfVisible; { Default state }
  1417. EventMask := evMouseDown + evKeyDown + evCommand; { Default event masks }
  1418. GOptions := goTabSelect; { Set new options }
  1419. SetBounds(Bounds); { Set view bounds }
  1420. END;
  1421. {--TView--------------------------------------------------------------------}
  1422. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06May98 LdB }
  1423. {---------------------------------------------------------------------------}
  1424. { This load method will read old original TV data from a stream but the }
  1425. { new options and tabmasks are not set so some NEW functionality is not }
  1426. { supported but it should work as per original TV code. }
  1427. {---------------------------------------------------------------------------}
  1428. CONSTRUCTOR TView.Load (Var S: TStream);
  1429. BEGIN
  1430. Inherited Init; { Call ancestor }
  1431. S.Read(Origin.X, 2); { Read origin x value }
  1432. S.Read(Origin.Y, 2); { Read origin y value }
  1433. S.Read(Size.X, 2); { Read view x size }
  1434. S.Read(Size.Y, 2); { Read view y size }
  1435. S.Read(Cursor.X, 2); { Read cursor x size }
  1436. S.Read(Cursor.Y, 2); { Read cursor y size }
  1437. S.Read(GrowMode, 1); { Read growmode flags }
  1438. S.Read(DragMode, 1); { Read dragmode flags }
  1439. S.Read(HelpCtx, 2); { Read help context }
  1440. S.Read(State, 2); { Read state masks }
  1441. S.Read(Options, 2); { Read options masks }
  1442. S.Read(Eventmask, 2); { Read event masks }
  1443. If (Options AND ofGFVModeView <> 0) Then Begin { STREAM HAS GFV TVIEW }
  1444. S.Read(GOptions, 2); { Read new option masks }
  1445. S.Read(TabMask, 1); { Read new tab masks }
  1446. S.Read(RawOrigin.X, 2); { Read raw x origin point }
  1447. S.Read(RawOrigin.Y, 2); { Read raw y origin point }
  1448. S.Read(RawSize.X, 2); { Read raw x size }
  1449. S.Read(RawSize.Y, 2); { Read raw y size }
  1450. S.Read(ColourOfs, 2); { Read palette offset }
  1451. End Else Begin { STREAM HAS OLD TView }
  1452. RawOrigin.X := Origin.X * FontWidth; { Set x origin pt }
  1453. RawOrigin.Y := Origin.Y * FontHeight; { Set y origin pt }
  1454. RawSize.X := (Size.X * FontWidth) - 1; { Calc raw x size }
  1455. RawSize.Y := (Size.Y * FontHeight) - 1; { Calc raw y size }
  1456. End;
  1457. END;
  1458. {--TView--------------------------------------------------------------------}
  1459. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Nov99 LdB }
  1460. {---------------------------------------------------------------------------}
  1461. DESTRUCTOR TView.Done;
  1462. VAR P: PComplexArea; {$IFNDEF OS_DOS} S: String; {$ENDIF}
  1463. BEGIN
  1464. Hide; { Hide the view }
  1465. If (Owner <> Nil) Then Owner^.Delete(@Self); { Delete from owner }
  1466. While (HoldLimit <> Nil) Do Begin { Free limit memory }
  1467. P := HoldLimit^.NextArea; { Hold next pointer }
  1468. FreeMem(HoldLimit, SizeOf(TComplexArea)); { Release memory }
  1469. HoldLimit := P; { Shuffle to next }
  1470. End;
  1471. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  1472. If (HWindow <> 0) Then Begin { Handle valid }
  1473. S := GetClassName + #0; { Make asciiz }
  1474. {$IFDEF OS_WINDOWS} { WIN/NT CODE}
  1475. {$IFDEF BIT_16} { 16 BIT CODE }
  1476. RemoveProp(HWindow, ViewSeg); { Remove seg property }
  1477. RemoveProp(HWindow, ViewOfs); { Remove offs property }
  1478. {$ENDIF}
  1479. {$IFDEF BIT_32} { 32 BIT CODE }
  1480. RemoveProp(HWindow, ViewPtr); { Remove view property }
  1481. {$ENDIF}
  1482. DestroyWindow(HWindow); { Destroy window }
  1483. If (GOptions AND goNativeClass = 0) Then { Not native class check }
  1484. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  1485. UnRegisterClass(CString(@S[1]), 0); { Unregister class }
  1486. {$ELSE} { OTHER COMPILERS }
  1487. UnRegisterClass(@S[1], HInstance); { Unregister class }
  1488. {$ENDIF}
  1489. {$ENDIF}
  1490. {$IFDEF OS_OS2} { OS2 CODE }
  1491. WinRemovePresParam(HWindow, PP_User); { Remove self ptr }
  1492. WinDestroyWindow(HWindow); { Destroy window }
  1493. If (GOptions AND goNativeClass = 0) Then { Not native class check }
  1494. WinDeregisterObjectClass(@S[1]); { Unregister class }
  1495. {$ENDIF}
  1496. End;
  1497. {$ENDIF}
  1498. END;
  1499. {--TView--------------------------------------------------------------------}
  1500. { Prev -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1501. {---------------------------------------------------------------------------}
  1502. FUNCTION TView.Prev: PView;
  1503. VAR P: PView;
  1504. BEGIN
  1505. P := @Self; { Start with self }
  1506. While (P^.Next <> Nil) AND (P^.Next <> @Self)
  1507. Do P := P^.Next; { Locate next view }
  1508. Prev := P; { Return result }
  1509. END;
  1510. {--TView--------------------------------------------------------------------}
  1511. { Execute -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1512. {---------------------------------------------------------------------------}
  1513. FUNCTION TView.Execute: Word;
  1514. BEGIN
  1515. Execute := cmCancel; { Return cancel }
  1516. END;
  1517. {--TView--------------------------------------------------------------------}
  1518. { Focus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05May98 LdB }
  1519. {---------------------------------------------------------------------------}
  1520. FUNCTION TView.Focus: Boolean;
  1521. VAR Res: Boolean;
  1522. BEGIN
  1523. Res := True; { Preset result }
  1524. If (State AND (sfSelected + sfModal)=0) Then Begin { Not modal/selected }
  1525. If (Owner <> Nil) Then Begin { View has an owner }
  1526. Res := Owner^.Focus; { Return focus state }
  1527. If Res Then { Owner has focus }
  1528. If ((Owner^.Current = Nil) OR { No current view }
  1529. (Owner^.Current^.Options AND ofValidate = 0) { Non validating view }
  1530. OR (Owner^.Current^.Valid(cmReleasedFocus))) { Okay to drop focus }
  1531. Then Select Else Res := False; { Then select us }
  1532. End;
  1533. End;
  1534. Focus := Res; { Return focus result }
  1535. END;
  1536. {--TView--------------------------------------------------------------------}
  1537. { DataSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1538. {---------------------------------------------------------------------------}
  1539. FUNCTION TView.DataSize: Word;
  1540. BEGIN
  1541. DataSize := 0; { Transfer size }
  1542. END;
  1543. {--TView--------------------------------------------------------------------}
  1544. { TopView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1545. {---------------------------------------------------------------------------}
  1546. FUNCTION TView.TopView: PView;
  1547. VAR P: PView;
  1548. BEGIN
  1549. If (TheTopView = Nil) Then Begin { Check topmost view }
  1550. P := @Self; { Start with us }
  1551. While (P <> Nil) AND (P^.State AND sfModal = 0) { Check if modal }
  1552. Do P := P^.Owner; { Search each owner }
  1553. TopView := P; { Return result }
  1554. End Else TopView := TheTopView; { Return topview }
  1555. END;
  1556. {--TView--------------------------------------------------------------------}
  1557. { PrevView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1558. {---------------------------------------------------------------------------}
  1559. FUNCTION TView.PrevView: PView;
  1560. BEGIN
  1561. If (@Self = Owner^.First) Then PrevView := Nil { We are first view }
  1562. Else PrevView := Prev; { Return our prior }
  1563. END;
  1564. {--TView--------------------------------------------------------------------}
  1565. { NextView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1566. {---------------------------------------------------------------------------}
  1567. FUNCTION TView.NextView: PView;
  1568. BEGIN
  1569. If (@Self = Owner^.Last) Then NextView := Nil { This is last view }
  1570. Else NextView := Next; { Return our next }
  1571. END;
  1572. {--TView--------------------------------------------------------------------}
  1573. { GetHelpCtx -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1574. {---------------------------------------------------------------------------}
  1575. FUNCTION TView.GetHelpCtx: Word;
  1576. BEGIN
  1577. If (State AND sfDragging <> 0) Then { Dragging state check }
  1578. GetHelpCtx := hcDragging Else { Return dragging }
  1579. GetHelpCtx := HelpCtx; { Return help context }
  1580. END;
  1581. {--TView--------------------------------------------------------------------}
  1582. { EventAvail -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1583. {---------------------------------------------------------------------------}
  1584. FUNCTION TView.EventAvail: Boolean;
  1585. VAR Event: TEvent;
  1586. BEGIN
  1587. GetEvent(Event); { Get next event }
  1588. If (Event.What <> evNothing) Then PutEvent(Event); { Put it back }
  1589. EventAvail := (Event.What <> evNothing); { Return result }
  1590. END;
  1591. {--TView--------------------------------------------------------------------}
  1592. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1593. {---------------------------------------------------------------------------}
  1594. FUNCTION TView.GetPalette: PPalette;
  1595. BEGIN
  1596. GetPalette := Nil; { Return nil ptr }
  1597. END;
  1598. {--TView--------------------------------------------------------------------}
  1599. { GetColor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  1600. {---------------------------------------------------------------------------}
  1601. FUNCTION TView.GetColor (Color: Word): Word;
  1602. VAR Col: Byte; W: Word; P: PPalette; Q: PView;
  1603. BEGIN
  1604. W := 0; { Clear colour word }
  1605. If (Hi(Color) > 0) Then Begin { High colour req }
  1606. Col := Hi(Color) + ColourOfs; { Initial offset }
  1607. Q := @Self; { Pointer to self }
  1608. Repeat
  1609. P := Q^.GetPalette; { Get our palette }
  1610. If (P <> Nil) Then Begin { Palette is valid }
  1611. If (Col <= Length(P^)) Then
  1612. Col := Ord(P^[Col]) Else { Return colour }
  1613. Col := ErrorAttr; { Error attribute }
  1614. End;
  1615. Q := Q^.Owner; { Move up to owner }
  1616. Until (Q = Nil); { Until no owner }
  1617. W := Col SHL 8; { Translate colour }
  1618. End;
  1619. If (Lo(Color) > 0) Then Begin
  1620. Col := Lo(Color) + ColourOfs; { Initial offset }
  1621. Q := @Self; { Pointer to self }
  1622. Repeat
  1623. P := Q^.GetPalette; { Get our palette }
  1624. If (P <> Nil) Then Begin { Palette is valid }
  1625. If (Col <= Length(P^)) Then
  1626. Col := Ord(P^[Col]) Else { Return colour }
  1627. Col := ErrorAttr; { Error attribute }
  1628. End;
  1629. Q := Q^.Owner; { Move up to owner }
  1630. Until (Q = Nil); { Until no owner }
  1631. End Else Col := ErrorAttr; { No colour found }
  1632. GetColor := W OR Col; { Return color }
  1633. END;
  1634. {--TView--------------------------------------------------------------------}
  1635. { Valid -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1636. {---------------------------------------------------------------------------}
  1637. FUNCTION TView.Valid (Command: Word): Boolean;
  1638. BEGIN
  1639. Valid := True; { Simply return true }
  1640. END;
  1641. {--TView--------------------------------------------------------------------}
  1642. { GetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1643. {---------------------------------------------------------------------------}
  1644. FUNCTION TView.GetState (AState: Word): Boolean;
  1645. BEGIN
  1646. GetState := State AND AState = AState; { Check states equal }
  1647. END;
  1648. {--TView--------------------------------------------------------------------}
  1649. { TextWidth -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Nov99 LdB }
  1650. {---------------------------------------------------------------------------}
  1651. FUNCTION TView.TextWidth (Txt: String): Integer;
  1652. VAR I: Integer; S: String;
  1653. {$IFNDEF OS_DOS} P: Pointer; Wnd: HWnd; {$ENDIF}
  1654. {$IFDEF OS_WINDOWS} ODc: HDc; M: TSize; {$ENDIF}
  1655. {$IFDEF OS_OS2} OPs: HPs; Pt: Array [0..3] Of PointL; {$ENDIF}
  1656. BEGIN
  1657. S := Txt; { Transfer text }
  1658. Repeat
  1659. I := Pos('~', S); { Check for tilde }
  1660. If (I <> 0) Then System.Delete(S, I, 1); { Remove the tilde }
  1661. Until (I = 0); { Remove all tildes }
  1662. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  1663. TextWidth := Length(S) * SysFontWidth; { Calc text length }
  1664. {$ENDIF}
  1665. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  1666. ODc := Dc; { Hold device context }
  1667. If (Dc = 0) Then Begin { No context set }
  1668. If (HWindow = 0) OR (State AND sfVisible = 0) { Check window valid }
  1669. OR (State AND sfExposed = 0)
  1670. Then Wnd := AppWindow Else Wnd := HWindow; { Select window or app }
  1671. Dc := GetDC(Wnd); { Get device context }
  1672. End;
  1673. SelectObject(Dc, DefGFVFont); { Select the font }
  1674. P := @S[1]; { Pointer to text }
  1675. {$IFDEF BIT_32} { WINDOWS 32 BIT CODE }
  1676. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  1677. If (GetTextExtentPoint(Dc, CString(P),
  1678. Length(S), M)=False) Then M.Cx := 0; { Get text extents }
  1679. {$ELSE} { OTHER COMPILERS }
  1680. {$IFDEF PPC_FPC} { FPC WINDOWS COMPILER }
  1681. If (GetTextExtentPoint(Dc, P, Length(S),
  1682. @M)=False) Then M.Cx := 0; { Get text extents }
  1683. {$ELSE} { ALL OTHER COMPILERS }
  1684. If (GetTextExtentPoint(Dc, P, Length(S),
  1685. M)=False) Then M.Cx := 0; { Get text extents }
  1686. {$ENDIF}
  1687. {$ENDIF}
  1688. {$ELSE} { WINDOWS 16 BIT CODE }
  1689. {$IFDEF PPC_DELPHI} { DELPHI1 COMPILER }
  1690. If (GetTextExtentPoint(Dc, @S[1], Length(S),
  1691. M)=False)Then M.Cx := 0; { Get text extents }
  1692. {$ELSE} { OTHER COMPILERS }
  1693. If (GetTextExtentPoint(Dc, @S[1], Length(S),
  1694. M.Cx)=False)Then M.Cx := 0; { Get text extents }
  1695. {$ENDIF}
  1696. {$ENDIF}
  1697. TextWidth := M.Cx; { Return text width }
  1698. If (ODc = 0) Then ReleaseDC(Wnd, Dc); { Release context }
  1699. Dc := ODc; { Original context set }
  1700. {$ENDIF}
  1701. {$IFDEF OS_OS2}
  1702. OPs := Ps; { Hold pres space }
  1703. If (Ps = 0) Then Begin
  1704. If (HWindow = 0) OR (State AND sfVisible = 0) { Check window valid }
  1705. OR (State AND sfExposed = 0)
  1706. Then Wnd := AppWindow Else Wnd := Client; { Select window or app }
  1707. Ps := WinGetPS(Wnd); { Get pres space }
  1708. End;
  1709. GPISetCharSet(PS, DefGFVFont); { Set the font style }
  1710. P := @S[1]; { Pointer to text }
  1711. GpiQueryTextBox(Ps, Length(S), P, 3, Pt[0]); { Get text extents }
  1712. TextWidth := Pt[2].X; { Return text width }
  1713. If (OPs = 0) Then WinReleasePS(Ps); { Release pres space }
  1714. Ps := OPs; { Original pres space }
  1715. {$ENDIF}
  1716. END;
  1717. {--TView--------------------------------------------------------------------}
  1718. { MouseInView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1719. {---------------------------------------------------------------------------}
  1720. FUNCTION TView.MouseInView (Point: TPoint): Boolean;
  1721. BEGIN
  1722. MouseInView := False; { Preset false }
  1723. If (Point.X < RawOrigin.X) Then Exit; { Point to left }
  1724. If (Point.X > (RawOrigin.X+RawSize.X)) Then Exit; { Point to right }
  1725. If (Point.Y < RawOrigin.Y) Then Exit; { Point is above }
  1726. If (Point.Y > (RawOrigin.Y+RawSize.Y)) Then Exit; { Point is below }
  1727. MouseInView := True; { Return true }
  1728. END;
  1729. {--TView--------------------------------------------------------------------}
  1730. { CommandEnabled -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1731. {---------------------------------------------------------------------------}
  1732. FUNCTION TView.CommandEnabled(Command: Word): Boolean;
  1733. BEGIN
  1734. CommandEnabled := (Command > 255) OR
  1735. (Command IN CurCommandSet); { Check command }
  1736. END;
  1737. {--TView--------------------------------------------------------------------}
  1738. { OverLapsArea -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1739. {---------------------------------------------------------------------------}
  1740. FUNCTION TView.OverlapsArea (X1, Y1, X2, Y2: Integer): Boolean;
  1741. BEGIN
  1742. OverLapsArea := False; { Preset false }
  1743. If (RawOrigin.X > X2) Then Exit; { Area to the left }
  1744. If ((RawOrigin.X + RawSize.X) < X1) Then Exit; { Area to the right }
  1745. If (RawOrigin.Y > Y2) Then Exit; { Area is above }
  1746. If ((RawOrigin.Y + RawSize.Y) < Y1) Then Exit; { Area is below }
  1747. OverLapsArea := True; { Return true }
  1748. END;
  1749. {--TView--------------------------------------------------------------------}
  1750. { MouseEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1751. {---------------------------------------------------------------------------}
  1752. FUNCTION TView.MouseEvent (Var Event: TEvent; Mask: Word): Boolean;
  1753. BEGIN
  1754. Repeat
  1755. GetEvent(Event); { Get next event }
  1756. Until (Event.What AND (Mask OR evMouseUp) <> 0); { Wait till valid }
  1757. MouseEvent := Event.What <> evMouseUp; { Return result }
  1758. END;
  1759. {--TView--------------------------------------------------------------------}
  1760. { Hide -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1761. {---------------------------------------------------------------------------}
  1762. PROCEDURE TView.Hide;
  1763. BEGIN
  1764. If (State AND sfVisible <> 0) Then { View is visible }
  1765. SetState(sfVisible, False); { Hide the view }
  1766. END;
  1767. {--TView--------------------------------------------------------------------}
  1768. { Show -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1769. {---------------------------------------------------------------------------}
  1770. PROCEDURE TView.Show;
  1771. BEGIN
  1772. If (State AND sfVisible = 0) Then { View not visible }
  1773. SetState(sfVisible, True); { Show the view }
  1774. END;
  1775. {--TView--------------------------------------------------------------------}
  1776. { Draw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1777. {---------------------------------------------------------------------------}
  1778. PROCEDURE TView.Draw;
  1779. BEGIN { Abstract method }
  1780. END;
  1781. {--TView--------------------------------------------------------------------}
  1782. { Select -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05May98 LdB }
  1783. {---------------------------------------------------------------------------}
  1784. PROCEDURE TView.Select;
  1785. BEGIN
  1786. If (Options AND ofSelectable <> 0) Then { View is selectable }
  1787. If (Options AND ofTopSelect <> 0) Then MakeFirst { Top selectable }
  1788. Else If (Owner <> Nil) Then { Valid owner }
  1789. Owner^.SetCurrent(@Self, NormalSelect); { Make owners current }
  1790. END;
  1791. {--TView--------------------------------------------------------------------}
  1792. { Awaken -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1793. {---------------------------------------------------------------------------}
  1794. PROCEDURE TView.Awaken;
  1795. BEGIN { Abstract method }
  1796. END;
  1797. {--TView--------------------------------------------------------------------}
  1798. { DrawView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06May98 LdB }
  1799. {---------------------------------------------------------------------------}
  1800. PROCEDURE TView.DrawView;
  1801. VAR ViewPort: ViewPortType; { Common variables }
  1802. {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF} { WIN/NT variables }
  1803. {$IFDEF OS_OS2} OPs: HPs; {$ENDIF} { OS2 variables }
  1804. BEGIN
  1805. If (State AND sfVisible <> 0) AND { View is visible }
  1806. (State AND sfExposed <> 0) AND { View is exposed }
  1807. (State AND sfIconised = 0) Then Begin { View not iconised }
  1808. SetViewLimits; { Set view limits }
  1809. GetViewSettings(ViewPort); { Get set viewport }
  1810. If OverlapsArea(ViewPort.X1, ViewPort.Y1,
  1811. ViewPort.X2, ViewPort.Y2) Then Begin { Must be in area }
  1812. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  1813. HideMouseCursor; { Hide mouse cursor }
  1814. {$ENDIF}
  1815. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  1816. If (HWindow <> 0) Then Begin { Valid window }
  1817. ODc := Dc; { Hold device context }
  1818. If (Dc = 0) Then Dc := GetDc(HWindow); { Get device context }
  1819. {$ENDIF}
  1820. {$IFDEF OS_OS2} { OS2 CODE }
  1821. If (HWindow <> 0) Then Begin { Valid window }
  1822. OPs := Ps; { Hold paint struct }
  1823. If (Ps = 0) Then Ps := WinGetPS(Client); { Create paint struct }
  1824. {$ENDIF}
  1825. If (DrawMask = 0) OR (DrawMask = vdNoChild) { No special masks set }
  1826. Then Begin { Treat as a full redraw }
  1827. DrawBackGround; { Draw background }
  1828. Draw; { Draw interior }
  1829. If (GOptions AND goDrawFocus <> 0) Then
  1830. DrawFocus; { Draw focus }
  1831. If (State AND sfCursorVis <> 0)
  1832. Then DrawCursor; { Draw any cursor }
  1833. If (Options AND ofFramed <> 0) OR
  1834. (GOptions AND goThickFramed <> 0) { View has border }
  1835. Then DrawBorder; { Draw border }
  1836. End Else Begin { Masked draws only }
  1837. If (DrawMask AND vdBackGnd <> 0) Then { Chk background mask }
  1838. DrawBackGround; { Draw background }
  1839. If (DrawMask AND vdInner <> 0) Then { Check Inner mask }
  1840. Draw; { Draw interior }
  1841. If (DrawMask AND vdFocus <> 0)
  1842. AND (GOptions AND goDrawFocus <> 0)
  1843. Then DrawFocus; { Check focus mask }
  1844. If (DrawMask AND vdCursor <> 0) Then { Check cursor mask }
  1845. DrawCursor; { Draw any cursor }
  1846. If (DrawMask AND vdBorder <> 0) Then { Check border mask }
  1847. DrawBorder; { Draw border }
  1848. End;
  1849. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  1850. ShowMouseCursor; { Show mouse cursor }
  1851. {$ENDIF}
  1852. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  1853. If (ODc = 0) Then ReleaseDc(HWindow, Dc); { Release context }
  1854. Dc := ODc; { Reset held context }
  1855. End;
  1856. {$ENDIF}
  1857. {$IFDEF OS_OS2} { OS2 CODE }
  1858. If (OPs = 0) Then WinReleasePS(Ps); { Free paint struct }
  1859. Ps := OPs; { Reset held struct }
  1860. End;
  1861. {$ENDIF}
  1862. End;
  1863. ReleaseViewLimits; { Release the limits }
  1864. End;
  1865. DrawMask := 0; { Clear the draw mask }
  1866. END;
  1867. {--TView--------------------------------------------------------------------}
  1868. { MakeFirst -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  1869. {---------------------------------------------------------------------------}
  1870. PROCEDURE TView.MakeFirst;
  1871. BEGIN
  1872. If (Owner <> Nil) Then Begin { Must have owner }
  1873. PutInFrontOf(Owner^.First); { Float to the top }
  1874. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  1875. If (HWindow <> 0) Then { Valid window }
  1876. SetWindowPos(HWindow, HWND_TOP, 0, 0, 0, 0,
  1877. swp_NoSize OR swp_NoMove); { Bring window to top }
  1878. {$ENDIF}
  1879. {$IFDEF OS_OS2} { OS2 CODE }
  1880. If (HWindow <> 0) Then { Valid window }
  1881. WinSetWindowPos(HWindow, HWND_TOP, 0, 0, 0, 0,
  1882. swp_ZOrder); { Bring window to top }
  1883. {$ENDIF}
  1884. End;
  1885. END;
  1886. {--TView--------------------------------------------------------------------}
  1887. { DrawFocus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1888. {---------------------------------------------------------------------------}
  1889. PROCEDURE TView.DrawFocus;
  1890. BEGIN { Abstract method }
  1891. END;
  1892. {--TView--------------------------------------------------------------------}
  1893. { DrawCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1894. {---------------------------------------------------------------------------}
  1895. PROCEDURE TView.DrawCursor;
  1896. BEGIN { Abstract method }
  1897. END;
  1898. {--TView--------------------------------------------------------------------}
  1899. { DrawBorder -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17May98 LdB }
  1900. {---------------------------------------------------------------------------}
  1901. PROCEDURE TView.DrawBorder;
  1902. BEGIN
  1903. {$IFDEF OS_DOS} { DOS/DPMI CODE ONLY }
  1904. BiColorRectangle(0, 0, RawSize.X, RawSize.Y, White,
  1905. DarkGray, False); { Draw 3d effect }
  1906. If (GOptions AND goThickFramed <> 0) Then Begin { Thick frame at work }
  1907. GraphRectangle(1, 1, RawSize.X-1, RawSize.Y-1,
  1908. LightGray); { Draw frame part 1 }
  1909. GraphRectangle(2, 2, RawSize.X-2, RawSize.Y-2,
  1910. LightGray); { Fraw frame part 2 }
  1911. BiColorRectangle(3, 3, RawSize.X-3, RawSize.Y-3,
  1912. White, DarkGray, True); { Draw highlights }
  1913. End;
  1914. {$ENDIF}
  1915. END;
  1916. {--TView--------------------------------------------------------------------}
  1917. { HideCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1918. {---------------------------------------------------------------------------}
  1919. PROCEDURE TView.HideCursor;
  1920. BEGIN
  1921. SetState(sfCursorVis , False); { Hide the cursor }
  1922. END;
  1923. {--TView--------------------------------------------------------------------}
  1924. { ShowCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1925. {---------------------------------------------------------------------------}
  1926. PROCEDURE TView.ShowCursor;
  1927. BEGIN
  1928. SetState(sfCursorVis , True); { Show the cursor }
  1929. END;
  1930. {--TView--------------------------------------------------------------------}
  1931. { BlockCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1932. {---------------------------------------------------------------------------}
  1933. PROCEDURE TView.BlockCursor;
  1934. BEGIN
  1935. SetState(sfCursorIns, True); { Set insert mode }
  1936. END;
  1937. {--TView--------------------------------------------------------------------}
  1938. { NormalCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1939. {---------------------------------------------------------------------------}
  1940. PROCEDURE TView.NormalCursor;
  1941. BEGIN
  1942. SetState(sfCursorIns, False); { Clear insert mode }
  1943. END;
  1944. {--TView--------------------------------------------------------------------}
  1945. { FocusFromTop -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 11Aug99 LdB }
  1946. {---------------------------------------------------------------------------}
  1947. PROCEDURE TView.FocusFromTop;
  1948. BEGIN
  1949. If (Owner <> Nil) AND
  1950. (Owner^.State AND sfSelected = 0)
  1951. Then Owner^.Select;
  1952. If (State AND sfFocused = 0) Then Focus;
  1953. If (State AND sfSelected = 0) Then Select;
  1954. END;
  1955. {--TView--------------------------------------------------------------------}
  1956. { SetViewLimits -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Sep99 LdB }
  1957. {---------------------------------------------------------------------------}
  1958. PROCEDURE TView.SetViewLimits;
  1959. VAR X1, Y1, X2, Y2: Integer; P: PGroup; ViewPort: ViewPortType; Ca: PComplexArea;
  1960. BEGIN
  1961. If (MaxAvail >= SizeOf(TComplexArea)) Then Begin { Check enough memory }
  1962. GetMem(Ca, SizeOf(TComplexArea)); { Allocate memory }
  1963. GetViewSettings(ViewPort); { Fetch view port }
  1964. Ca^.X1 := ViewPort.X1; { Hold current X1 }
  1965. Ca^.Y1 := ViewPort.Y1; { Hold current Y1 }
  1966. Ca^.X2 := ViewPort.X2; { Hold current X2 }
  1967. Ca^.Y2 := ViewPort.Y2; { Hold current Y2 }
  1968. Ca^.NextArea := HoldLimit; { Pointer to next }
  1969. HoldLimit := Ca; { Move down chain }
  1970. X1 := RawOrigin.X; { Xfer x raw origin }
  1971. Y1 := RawOrigin.Y; { Xfer y raw origin }
  1972. X2 := X1 + RawSize.X; { Calc right value }
  1973. Y2 := Y1 + RawSize.Y; { Calc lower value }
  1974. P := Owner; { Start on owner }
  1975. While (P <> Nil) Do Begin { While owner valid }
  1976. If (X1 < P^.RawOrigin.X) Then
  1977. X1 := P^.RawOrigin.X; { X minimum contain }
  1978. If (Y1 < P^.RawOrigin.Y) Then
  1979. Y1 := P^.RawOrigin.Y; { Y minimum contain }
  1980. If (X2 > P^.RawOrigin.X + P^.RawSize.X)
  1981. Then X2 := P^.RawOrigin.X + P^.RawSize.X; { X maximum contain }
  1982. If (Y2 > P^.RawOrigin.Y + P^.RawSize.Y)
  1983. Then Y2 := P^.RawOrigin.Y + P^.RawSize.Y; { Y maximum contain }
  1984. P := P^.Owner; { Move to owners owner }
  1985. End;
  1986. If (LimitsLocked <> Nil) Then Begin { Locked = area redraw }
  1987. If (X2 < ViewPort.X1) Then Exit; { View left of locked }
  1988. If (X1 > ViewPort.X2) Then Exit; { View right of locked }
  1989. If (Y2 < ViewPort.Y1) Then Exit; { View above locked }
  1990. If (Y1 > ViewPort.Y2) Then Exit; { View below locked }
  1991. If (X1 < ViewPort.X1) Then X1 := ViewPort.X1; { Adjust x1 to locked }
  1992. If (Y1 < ViewPort.Y1) Then Y1 := ViewPort.Y1; { Adjust y1 to locked }
  1993. If (X2 > ViewPort.X2) Then X2 := ViewPort.X2; { Adjust x2 to locked }
  1994. If (Y2 > ViewPort.Y2) Then Y2 := ViewPort.Y2; { Adjust y2 to locked }
  1995. End;
  1996. SetViewPort(X1, Y1, X2, Y2, ClipOn); { Set new clip limits }
  1997. End;
  1998. END;
  1999. {--TView--------------------------------------------------------------------}
  2000. { DrawBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 21Sep99 LdB }
  2001. {---------------------------------------------------------------------------}
  2002. PROCEDURE TView.DrawBackGround;
  2003. VAR Bc: Byte; X1, Y1, X2, Y2: Integer; ViewPort: ViewPortType;
  2004. {$IFDEF OS_OS2} Ptl: PointL; {$ENDIF}
  2005. BEGIN
  2006. If (GOptions AND goNoDrawView = 0) Then Begin { Non draw views exit }
  2007. If (State AND sfDisabled = 0) Then
  2008. Bc := GetColor(1) AND $F0 SHR 4 Else { Select back colour }
  2009. Bc := GetColor(4) AND $F0 SHR 4; { Disabled back colour }
  2010. GetViewSettings(ViewPort); { Get view settings }
  2011. If (ViewPort.X1 <= RawOrigin.X) Then X1 := 0 { Right to left edge }
  2012. Else X1 := ViewPort.X1-RawOrigin.X; { Offset from left }
  2013. If (ViewPort.Y1 <= RawOrigin.Y) Then Y1 := 0 { Right to top edge }
  2014. Else Y1 := ViewPort.Y1-RawOrigin.Y; { Offset from top }
  2015. If (ViewPort.X2 >= RawOrigin.X+RawSize.X) Then
  2016. X2 := RawSize.X Else { Right to right edge }
  2017. X2 := ViewPort.X2-RawOrigin.X; { Offset from right }
  2018. If (ViewPort.Y2 >= RawOrigin.Y+RawSize.Y) Then
  2019. Y2 := RawSize.Y Else { Right to bottom edge }
  2020. Y2 := ViewPort.Y2-RawOrigin.Y; { Offset from bottom }
  2021. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  2022. SetFillStyle(SolidFill, Bc); { Set fill colour }
  2023. Bar(0, 0, X2-X1, Y2-Y1); { Clear the area }
  2024. {$ENDIF}
  2025. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  2026. If (Dc <> 0) Then Begin { Valid device context }
  2027. SelectObject(Dc, ColBrush[Bc]); { Select brush }
  2028. SelectObject(Dc, ColPen[Bc]); { Select pen }
  2029. Rectangle(Dc, X1, Y1, X2+1, Y2+1); { Clear the view area }
  2030. End;
  2031. {$ENDIF}
  2032. {$IFDEF OS_OS2} { OS2 CODE }
  2033. If (Ps <> 0) Then Begin { Valid pres space }
  2034. GpiSetColor(Ps, ColRef[Bc]); { Select colour }
  2035. Ptl.X := X1; { X1 position }
  2036. Ptl.Y := RawSize.Y - Y1; { Y1 position }
  2037. GpiMove(PS, Ptl); { Move to position }
  2038. Ptl.X := X2; { X2 position }
  2039. Ptl.Y := RawSize.Y - Y2; { Y2 position }
  2040. GpiBox(Ps, dro_Fill, Ptl, 0, 0); { Clear the view area }
  2041. End;
  2042. {$ENDIF}
  2043. End;
  2044. END;
  2045. {--TView--------------------------------------------------------------------}
  2046. { ReleaseViewLimits -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05May98 LdB }
  2047. {---------------------------------------------------------------------------}
  2048. PROCEDURE TView.ReleaseViewLimits;
  2049. VAR P: PComplexArea;
  2050. BEGIN
  2051. P := HoldLimit; { Transfer pointer }
  2052. If (P <> Nil) Then Begin { Valid complex area }
  2053. HoldLimit := P^.NextArea; { Move to prior area }
  2054. SetViewPort(P^.X1, P^.Y1, P^.X2, P^.Y2, ClipOn); { Restore clip limits }
  2055. FreeMem(P, SizeOf(TComplexArea)); { Release memory }
  2056. End;
  2057. END;
  2058. {--TView--------------------------------------------------------------------}
  2059. { MoveTo -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2060. {---------------------------------------------------------------------------}
  2061. PROCEDURE TView.MoveTo (X, Y: Integer);
  2062. VAR R: TRect;
  2063. BEGIN
  2064. R.Assign(X, Y, X + Size.X, Y + Size.Y); { Assign area }
  2065. Locate(R); { Locate the view }
  2066. END;
  2067. {--TView--------------------------------------------------------------------}
  2068. { GrowTo -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2069. {---------------------------------------------------------------------------}
  2070. PROCEDURE TView.GrowTo (X, Y: Integer);
  2071. VAR R: TRect;
  2072. BEGIN
  2073. R.Assign(Origin.X, Origin.Y, Origin.X + X,
  2074. Origin.Y + Y); { Assign area }
  2075. Locate(R); { Locate the view }
  2076. END;
  2077. {--TView--------------------------------------------------------------------}
  2078. { SetDrawMask -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Sep99 LdB }
  2079. {---------------------------------------------------------------------------}
  2080. PROCEDURE TView.SetDrawMask (Mask: Byte);
  2081. BEGIN
  2082. If (Options AND ofFramed = 0) AND { Check for no frame }
  2083. (GOptions AND goThickFramed = 0) AND { Check no thick frame }
  2084. (GOptions AND goTitled = 0) Then { Check for title }
  2085. Mask := Mask AND NOT vdBorder; { Clear border draw }
  2086. If (State AND sfCursorVis = 0) Then { Check for no cursor }
  2087. Mask := Mask AND NOT vdCursor; { Clear cursor draw }
  2088. If (GOptions AND goDrawFocus = 0) Then { Check no focus draw }
  2089. Mask := Mask AND NOT vdFocus; { Clear focus draws }
  2090. DrawMask := DrawMask OR Mask; { Set draw masks }
  2091. END;
  2092. {--TView--------------------------------------------------------------------}
  2093. { EndModal -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2094. {---------------------------------------------------------------------------}
  2095. PROCEDURE TView.EndModal (Command: Word);
  2096. VAR P: PView;
  2097. BEGIN
  2098. P := TopView; { Get top view }
  2099. If (P <> Nil) Then P^.EndModal(Command); { End modal operation }
  2100. END;
  2101. {--TView--------------------------------------------------------------------}
  2102. { SetCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  2103. {---------------------------------------------------------------------------}
  2104. PROCEDURE TView.SetCursor (X, Y: Integer);
  2105. BEGIN
  2106. Cursor.X := X; { New x position }
  2107. Cursor.Y := Y; { New y position }
  2108. If (State AND sfCursorVis <> 0) Then Begin { Cursor visible }
  2109. SetDrawMask(vdCursor); { Set draw mask }
  2110. DrawView; { Draw the cursor }
  2111. End;
  2112. END;
  2113. {--TView--------------------------------------------------------------------}
  2114. { PutInFrontOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  2115. {---------------------------------------------------------------------------}
  2116. PROCEDURE TView.PutInFrontOf (Target: PView);
  2117. VAR P, LastView: PView;
  2118. BEGIN
  2119. If (Owner <> Nil) AND (Target <> @Self) AND
  2120. (Target <> NextView) AND ((Target = Nil) OR
  2121. (Target^.Owner = Owner)) Then { Check validity }
  2122. If (State AND sfVisible = 0) Then Begin { View not visible }
  2123. Owner^.RemoveView(@Self); { Remove from list }
  2124. Owner^.InsertView(@Self, Target); { Insert into list }
  2125. End Else Begin
  2126. LastView := NextView; { Hold next view }
  2127. If (LastView <> Nil) Then Begin { Lastview is valid }
  2128. P := Target; { P is target }
  2129. While (P <> Nil) AND (P <> LastView)
  2130. Do P := P^.NextView; { Find our next view }
  2131. If (P = Nil) Then LastView := Target; { Lastview is target }
  2132. End;
  2133. State := State AND NOT sfVisible; { Temp stop drawing }
  2134. If (LastView = Target) Then
  2135. If (Owner <> Nil) Then Owner^.ReDrawArea(
  2136. RawOrigin.X, RawOrigin.Y, RawOrigin.X +
  2137. RawSize.X, RawOrigin.Y + RawSize.Y); { Redraw old area }
  2138. Owner^.RemoveView(@Self); { Remove from list }
  2139. Owner^.InsertView(@Self, Target); { Insert into list }
  2140. State := State OR sfVisible; { Allow drawing again }
  2141. If (LastView <> Target) Then DrawView; { Draw the view now }
  2142. If (Options AND ofSelectable <> 0) Then { View is selectable }
  2143. If (Owner <> Nil) Then Owner^.ResetCurrent; { Reset current }
  2144. End;
  2145. END;
  2146. { ******************************* REMARK ****************************** }
  2147. { The original TV origin data is only adjusted incase the user uses }
  2148. { the values directly. New views should rely only on RawOrigin values. }
  2149. { ****************************** END REMARK *** Leon de Boer, 15May98 * }
  2150. {--TView--------------------------------------------------------------------}
  2151. { DisplaceBy -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15May98 LdB }
  2152. {---------------------------------------------------------------------------}
  2153. PROCEDURE TView.DisplaceBy (Dx, Dy: Integer);
  2154. BEGIN
  2155. RawOrigin.X := RawOrigin.X + Dx; { Displace raw x }
  2156. RawOrigin.Y := RawOrigin.Y + Dy; { Displace raw y }
  2157. Origin.X := RawOrigin.X DIV FontWidth; { Calc new x origin }
  2158. Origin.Y := RawOrigin.Y DIV FontHeight; { Calc new y origin }
  2159. END;
  2160. {--TView--------------------------------------------------------------------}
  2161. { SetCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2162. {---------------------------------------------------------------------------}
  2163. PROCEDURE TView.SetCommands (Commands: TCommandSet);
  2164. BEGIN
  2165. CommandSetChanged := CommandSetChanged OR
  2166. (CurCommandSet <> Commands); { Set change flag }
  2167. CurCommandSet := Commands; { Set command set }
  2168. END;
  2169. {--TView--------------------------------------------------------------------}
  2170. { ReDrawArea -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05May98 LdB }
  2171. {---------------------------------------------------------------------------}
  2172. PROCEDURE TView.ReDrawArea (X1, Y1, X2, Y2: Integer);
  2173. VAR HLimit: PView; ViewPort: ViewPortType;
  2174. BEGIN
  2175. GetViewSettings(ViewPort); { Hold view port }
  2176. SetViewPort(X1, Y1, X2, Y2, ClipOn); { Set new clip limits }
  2177. HLimit := LimitsLocked; { Hold lock limits }
  2178. LimitsLocked := @Self; { We are the lock view }
  2179. DrawView; { Redraw the area }
  2180. LimitsLocked := HLimit; { Release our lock }
  2181. SetViewPort(ViewPort.X1, ViewPort.Y1,
  2182. ViewPort.X2, ViewPort.Y2, ClipOn); { Reset old limits }
  2183. END;
  2184. {--TView--------------------------------------------------------------------}
  2185. { EnableCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2186. {---------------------------------------------------------------------------}
  2187. PROCEDURE TView.EnableCommands (Commands: TCommandSet);
  2188. BEGIN
  2189. CommandSetChanged := CommandSetChanged OR
  2190. (CurCommandSet * Commands <> Commands); { Set changed flag }
  2191. CurCommandSet := CurCommandSet + Commands; { Update command set }
  2192. END;
  2193. {--TView--------------------------------------------------------------------}
  2194. { DisableCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2195. {---------------------------------------------------------------------------}
  2196. PROCEDURE TView.DisableCommands (Commands: TCommandSet);
  2197. BEGIN
  2198. CommandSetChanged := CommandSetChanged OR
  2199. (CurCommandSet * Commands <> []); { Set changed flag }
  2200. CurCommandSet := CurCommandSet - Commands; { Update command set }
  2201. END;
  2202. {--TView--------------------------------------------------------------------}
  2203. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep99 LdB }
  2204. {---------------------------------------------------------------------------}
  2205. PROCEDURE TView.SetState (AState: Word; Enable: Boolean);
  2206. VAR Command: Word;
  2207. BEGIN
  2208. If Enable Then State := State OR AState { Set state mask }
  2209. Else State := State AND NOT AState; { Clear state mask }
  2210. If (AState AND sfVisible <> 0) Then Begin { Visibilty change }
  2211. If (Owner <> Nil) AND { valid owner }
  2212. (Owner^.State AND sfExposed <> 0) { If owner exposed }
  2213. Then SetState(sfExposed, Enable); { Expose this view }
  2214. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  2215. If Enable Then DrawView Else { Draw the view }
  2216. If (Owner <> Nil) Then Owner^.ReDrawArea( { Owner valid }
  2217. RawOrigin.X, RawOrigin.Y, RawOrigin.X +
  2218. RawSize.X, RawOrigin.Y + RawSize.Y); { Owner redraws area }
  2219. {$ENDIF}
  2220. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  2221. If (HWindow <> 0) Then Begin { Window handle valid }
  2222. If Enable Then ShowWindow(HWindow, sw_Show) { Show the window }
  2223. Else ShowWindow(HWindow, sw_Hide); { Hide the window }
  2224. End;
  2225. {$ENDIF}
  2226. {$IFDEF OS_OS2} { OS2 CODE }
  2227. If (HWindow <> 0) Then Begin { Window handle valid }
  2228. If Enable Then WinSetWindowPos(HWindow, 0, 0,
  2229. 0, 0, 0, swp_Show) { Show the window }
  2230. Else WinSetWindowPos(HWindow, 0, 0, 0, 0, 0,
  2231. swp_Hide); { Hide the window }
  2232. End;
  2233. {$ENDIF}
  2234. If (Options AND ofSelectable <> 0) Then { View is selectable }
  2235. If (Owner <> Nil) Then Owner^.ResetCurrent; { Reset selected }
  2236. End;
  2237. If (AState AND sfFocused <> 0) Then Begin { Focus change }
  2238. If (Owner <> Nil) Then Begin { Owner valid }
  2239. If Enable Then Command := cmReceivedFocus { View gaining focus }
  2240. Else Command := cmReleasedFocus; { View losing focus }
  2241. Message(Owner, evBroadcast, Command, @Self); { Send out message }
  2242. End;
  2243. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  2244. If (HWindow <> 0) Then { Window handle valid }
  2245. If Enable Then SetFocus(HWindow); { Focus the window }
  2246. {$ENDIF}
  2247. {$IFDEF OS_OS2} { OS2 CODE }
  2248. If (HWindow <> 0) Then { Window handle valid }
  2249. If Enable Then WinSetFocus(HWND_DESKTOP,
  2250. HWindow); { Focus the window }
  2251. {$ENDIF}
  2252. If (GOptions AND goDrawFocus <> 0) Then Begin { Draw focus view }
  2253. SetDrawMask(vdFocus); { Set focus draw mask }
  2254. DrawView; { Redraw focus change }
  2255. End;
  2256. End;
  2257. If (AState AND (sfCursorVis + sfCursorIns) <> 0) { Change cursor state }
  2258. Then Begin
  2259. SetDrawMask(vdCursor); { Set cursor draw mask }
  2260. DrawView; { Redraw the cursor }
  2261. End;
  2262. If (AState AND sfDisabled <> 0) Then Begin { Disbale change }
  2263. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  2264. If (HWindow <> 0) Then { Window handle valid }
  2265. If Enable Then EnableWindow(HWindow, False) { Disable the window }
  2266. Else EnableWindow(HWindow, True); { Enable the window }
  2267. {$ENDIF}
  2268. {$IFDEF OS_OS2} { OS2 CODE }
  2269. If (HWindow <> 0) Then { Window handle valid }
  2270. If Enable Then WinEnableWindow(HWindow,False) { Disable the window }
  2271. Else WinEnableWindow(HWindow, True); { Enable the window }
  2272. {$ENDIF}
  2273. End;
  2274. If (AState AND sfShadow <> 0) Then Begin End; { Change shadow state }
  2275. END;
  2276. {--TView--------------------------------------------------------------------}
  2277. { SetCmdState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2278. {---------------------------------------------------------------------------}
  2279. PROCEDURE TView.SetCmdState (Commands: TCommandSet; Enable: Boolean);
  2280. BEGIN
  2281. If Enable Then EnableCommands(Commands) { Enable commands }
  2282. Else DisableCommands(Commands); { Disable commands }
  2283. END;
  2284. {--TView--------------------------------------------------------------------}
  2285. { GetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2286. {---------------------------------------------------------------------------}
  2287. PROCEDURE TView.GetData (Var Rec);
  2288. BEGIN { Abstract method }
  2289. END;
  2290. {--TView--------------------------------------------------------------------}
  2291. { SetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2292. {---------------------------------------------------------------------------}
  2293. PROCEDURE TView.SetData (Var Rec);
  2294. BEGIN { Abstract method }
  2295. END;
  2296. {--TView--------------------------------------------------------------------}
  2297. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06May98 LdB }
  2298. {---------------------------------------------------------------------------}
  2299. { You can save data to the stream compatable with the old original TV by }
  2300. { temporarily turning off the ofGFVModeView making the call to this store }
  2301. { routine and resetting the ofGFVModeView flag after the call. }
  2302. {---------------------------------------------------------------------------}
  2303. PROCEDURE TView.Store (Var S: TStream);
  2304. VAR SaveState: Word;
  2305. BEGIN
  2306. SaveState := State; { Hold current state }
  2307. State := State AND NOT (sfActive OR sfSelected OR
  2308. sfFocused OR sfExposed); { Clear flags }
  2309. S.Write(Origin.X, 2); { Write view x origin }
  2310. S.Write(Origin.Y, 2); { Write view y origin }
  2311. S.Write(Size.X, 2); { Write view x size }
  2312. S.Write(Size.Y, 2); { Write view y size }
  2313. S.Write(Cursor.X, 2); { Write cursor x size }
  2314. S.Write(Cursor.Y, 2); { Write cursor y size }
  2315. S.Write(GrowMode, 1); { Write growmode flags }
  2316. S.Write(DragMode, 1); { Write dragmode flags }
  2317. S.Write(HelpCtx, 2); { Write help context }
  2318. S.Write(State, 2); { Write state masks }
  2319. S.Write(Options, 2); { Write options masks }
  2320. S.Write(Eventmask, 2); { Write event masks }
  2321. If (Options AND ofGFVModeView <> 0) Then Begin { GFV GRAPHICAL TVIEW }
  2322. S.Write(GOptions, 2); { Write new option masks }
  2323. S.Write(TabMask, 1); { Write new tab masks }
  2324. S.Write(RawOrigin.X, 2); { Write raw origin x point }
  2325. S.Write(RawOrigin.Y, 2); { Write raw origin y point }
  2326. S.Write(RawSize.X, 2); { Write raw x size }
  2327. S.Write(RawSize.Y, 2); { Write raw y size }
  2328. S.Write(ColourOfs, 2); { Write Palette offset }
  2329. End;
  2330. State := SaveState; { Reset state masks }
  2331. END;
  2332. {--TView--------------------------------------------------------------------}
  2333. { Locate -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 24Sep99 LdB }
  2334. {---------------------------------------------------------------------------}
  2335. PROCEDURE TView.Locate (Var Bounds: TRect);
  2336. VAR {$IFDEF OS_DOS} X1, Y1, X2, Y2: Integer; {$ENDIF}
  2337. Min, Max: TPoint; R: TRect;
  2338. FUNCTION Range(Val, Min, Max: Integer): Integer;
  2339. BEGIN
  2340. If (Val < Min) Then Range := Min Else { Value to small }
  2341. If (Val > Max) Then Range := Max Else { Value to large }
  2342. Range := Val; { Value is okay }
  2343. END;
  2344. BEGIN
  2345. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  2346. X1 := RawOrigin.X; { Current x origin }
  2347. Y1 := RawOrigin.Y; { Current y origin }
  2348. X2 := RawOrigin.X + RawSize.X; { Current x size }
  2349. Y2 := RawOrigin.Y + RawSize.Y; { Current y size }
  2350. {$ENDIF}
  2351. SizeLimits(Min, Max); { Get size limits }
  2352. Bounds.B.X := Bounds.A.X + Range(Bounds.B.X -
  2353. Bounds.A.X, Min.X, Max.X); { X bound limit }
  2354. Bounds.B.Y := Bounds.A.Y + Range(Bounds.B.Y
  2355. - Bounds.A.Y, Min.Y, Max.Y); { Y bound limit }
  2356. GetBounds(R); { Current bounds }
  2357. If NOT Bounds.Equals(R) Then Begin { Size has changed }
  2358. ChangeBounds(Bounds); { Change bounds }
  2359. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  2360. If (State AND sfVisible <> 0) AND { View is visible }
  2361. (State AND sfExposed <> 0) AND (Owner <> Nil) { Check view exposed }
  2362. Then Owner^.ReDrawArea(X1, Y1, X2, Y2); { Owner redraw }
  2363. DrawView; { Redraw the view }
  2364. {$ENDIF}
  2365. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  2366. If (HWindow <> 0) Then Begin { Valid window handle }
  2367. If (Owner <> Nil) AND (Owner^.HWindow <> 0) { Valid owner }
  2368. Then MoveWindow(HWindow, RawOrigin.X-Owner^.RawOrigin.X,
  2369. RawOrigin.Y-Owner^.RawOrigin.Y, RawSize.X+1,
  2370. RawSize.Y+1, True) Else { Move window in owner }
  2371. MoveWindow(HWindow, RawOrigin.X, RawOrigin.Y,
  2372. RawSize.X+1, RawSize.Y+1, True); { Move window raw }
  2373. End;
  2374. {$ENDIF}
  2375. {$IFDEF OS_OS2} { OS2 CODE }
  2376. If (HWindow <> 0) Then Begin { Valid window handle }
  2377. If (Owner <> Nil) AND (Owner^.HWindow <> 0) { Valid owner }
  2378. Then WinSetWindowPos(HWindow, 0,
  2379. RawOrigin.X - Owner^.RawOrigin.X,
  2380. (Owner^.RawOrigin.Y + Owner^.RawSize.Y) -
  2381. (RawOrigin.Y + RawSize.Y), RawSize.X,
  2382. RawSize.Y, swp_Size OR swp_Move) Else { Move window in owner }
  2383. WinSetWindowPos(HWindow, 0, RawOrigin.X,
  2384. SysScreenHeight - (RawOrigin.Y + RawSize.Y),
  2385. RawSize.X, RawSize.Y, swp_Size OR swp_Move); { Move window raw }
  2386. End;
  2387. {$ENDIF}
  2388. End;
  2389. END;
  2390. {--TView--------------------------------------------------------------------}
  2391. { KeyEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2392. {---------------------------------------------------------------------------}
  2393. PROCEDURE TView.KeyEvent (Var Event: TEvent);
  2394. BEGIN
  2395. Repeat
  2396. GetEvent(Event); { Get next event }
  2397. Until (Event.What = evKeyDown); { Wait till keydown }
  2398. END;
  2399. {--TView--------------------------------------------------------------------}
  2400. { GetEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2401. {---------------------------------------------------------------------------}
  2402. PROCEDURE TView.GetEvent (Var Event: TEvent);
  2403. BEGIN
  2404. If (Owner <> Nil) Then Owner^.GetEvent(Event); { Event from owner }
  2405. END;
  2406. {--TView--------------------------------------------------------------------}
  2407. { PutEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2408. {---------------------------------------------------------------------------}
  2409. PROCEDURE TView.PutEvent (Var Event: TEvent);
  2410. BEGIN
  2411. If (Owner <> Nil) Then Owner^.PutEvent(Event); { Put in owner }
  2412. END;
  2413. {--TView--------------------------------------------------------------------}
  2414. { GetExtent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2415. {---------------------------------------------------------------------------}
  2416. PROCEDURE TView.GetExtent (Var Extent: TRect);
  2417. BEGIN
  2418. Extent.A.X := 0; { Zero x field }
  2419. Extent.A.Y := 0; { Zero y field }
  2420. Extent.B.X := Size.X; { Return x size }
  2421. Extent.B.Y := Size.Y; { Return y size }
  2422. END;
  2423. {--TView--------------------------------------------------------------------}
  2424. { GetBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2425. {---------------------------------------------------------------------------}
  2426. PROCEDURE TView.GetBounds (Var Bounds: TRect);
  2427. BEGIN
  2428. Bounds.A := Origin; { Get first corner }
  2429. Bounds.B.X := Origin.X + Size.X; { Calc corner x value }
  2430. Bounds.B.Y := Origin.Y + Size.Y; { Calc corner y value }
  2431. If (Owner <> Nil) Then
  2432. Bounds.Move(-Owner^.Origin.X, -Owner^.Origin.Y); { Sub owner offset }
  2433. END;
  2434. {--TView--------------------------------------------------------------------}
  2435. { SetBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 24Sep99 LdB }
  2436. {---------------------------------------------------------------------------}
  2437. PROCEDURE TView.SetBounds (Var Bounds: TRect);
  2438. VAR D, COrigin: TPoint;
  2439. BEGIN
  2440. If (Bounds.B.X > 0) AND (Bounds.B.Y > 0) { Normal text co-ords }
  2441. AND (GOptions AND goGraphView = 0) Then Begin { Normal text view }
  2442. If (Owner <> Nil) Then Begin { Owner is valid }
  2443. COrigin.X := Origin.X - Owner^.Origin.X; { Corrected x origin }
  2444. COrigin.Y := Origin.Y - Owner^.Origin.Y; { Corrected y origin }
  2445. D.X := Bounds.A.X - COrigin.X; { X origin disp }
  2446. D.Y := Bounds.A.Y - COrigin.Y; { Y origin disp }
  2447. If ((D.X <> 0) OR (D.Y <> 0)) Then
  2448. DisplaceBy(D.X*FontWidth, D.Y*FontHeight); { Offset the view }
  2449. End Else Origin := Bounds.A; { Hold as origin }
  2450. Size.X := Bounds.B.X-Bounds.A.X; { Hold view x size }
  2451. Size.Y := Bounds.B.Y-Bounds.A.Y; { Hold view y size }
  2452. RawOrigin.X := Origin.X * FontWidth; { Raw x origin }
  2453. RawOrigin.Y := Origin.Y * FontHeight; { Raw y origin }
  2454. RawSize.X := Size.X * FontWidth - 1; { Set raw x size }
  2455. RawSize.Y := Size.Y * FontHeight - 1; { Set raw y size }
  2456. End Else Begin { Graphical co-ords }
  2457. If (Owner <> Nil) Then Begin { Owner is valid }
  2458. COrigin.X := RawOrigin.X - Owner^.RawOrigin.X; { Corrected x origin }
  2459. COrigin.Y := RawOrigin.Y - Owner^.RawOrigin.Y; { Corrected y origin }
  2460. D.X := Bounds.A.X - COrigin.X; { X origin disp }
  2461. D.Y := Bounds.A.Y - COrigin.Y; { Y origin disp }
  2462. If ((D.X <> 0) OR (D.Y <> 0)) Then
  2463. DisplaceBy(D.X, D.Y); { Offset the view }
  2464. End Else RawOrigin := Bounds.A; { Hold as origin }
  2465. RawSize.X := Abs(Bounds.B.X) - Bounds.A.X; { Set raw x size }
  2466. RawSize.Y := Abs(Bounds.B.Y) - Bounds.A.Y; { Set raw y size }
  2467. Origin.X := RawOrigin.X DIV FontWidth; { Rough x position }
  2468. Origin.Y := RawOrigin.Y DIV FontHeight; { Rough y position }
  2469. Size.X := RawSize.X DIV FontWidth; { Rough x size }
  2470. Size.Y := RawSize.Y DIV FontHeight; { Rough y size }
  2471. End;
  2472. Options := Options OR ofGFVModeView; { Now in GFV mode }
  2473. END;
  2474. {--TView--------------------------------------------------------------------}
  2475. { GetClipRect -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2476. {---------------------------------------------------------------------------}
  2477. PROCEDURE TView.GetClipRect (Var Clip: TRect);
  2478. BEGIN
  2479. GetBounds(Clip); { Get current bounds }
  2480. If (Owner <> Nil) Then Clip.Intersect(Owner^.Clip);{ Intersect with owner }
  2481. Clip.Move(-Origin.X, -Origin.Y); { Sub owner origin }
  2482. END;
  2483. {--TView--------------------------------------------------------------------}
  2484. { ClearEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2485. {---------------------------------------------------------------------------}
  2486. PROCEDURE TView.ClearEvent (Var Event: TEvent);
  2487. BEGIN
  2488. Event.What := evNothing; { Clear the event }
  2489. Event.InfoPtr := @Self; { Set us as handler }
  2490. END;
  2491. {--TView--------------------------------------------------------------------}
  2492. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2493. {---------------------------------------------------------------------------}
  2494. PROCEDURE TView.HandleEvent (Var Event: TEvent);
  2495. BEGIN
  2496. If (Event.What = evMouseDown) Then { Mouse down event }
  2497. If (State AND (sfSelected OR sfDisabled) = 0) { Not selected/disabled }
  2498. AND (Options AND ofSelectable <> 0) Then { View is selectable }
  2499. If (Focus = False) OR { Not view with focus }
  2500. (Options AND ofFirstClick = 0) { Not 1st click select }
  2501. Then ClearEvent(Event); { Handle the event }
  2502. If (Event.What = evKeyDown) AND { Key down event }
  2503. (Options OR ofGFVModeView <> 0) Then Begin { GFV mode view check }
  2504. If (Owner <> Nil) AND (TabMask <> 0) AND { Owner and tab masks }
  2505. (State AND sfFocused <> 0) Then Begin { View has focus }
  2506. Case Event.KeyCode Of
  2507. kbTab: If (TabMask AND tmTab <> 0) Then { Tab key mask set }
  2508. Owner^.FocusNext(False) Else Exit; { Focus next view }
  2509. kbEnter: If (TabMask AND tmEnter <> 0) Then { Enter key mask set }
  2510. Owner^.FocusNext(False) Else Exit; { Focus next view }
  2511. kbShiftTab: If (TabMask AND tmShiftTab <> 0) { Shit tab mask set }
  2512. Then Owner^.FocusNext(True) Else Exit; { Focus prior view }
  2513. kbLeft: If (TabMask AND tmLeft <> 0) Then { Left arrow mask set }
  2514. Owner^.FocusNext(True) Else Exit; { Focus prior view }
  2515. kbRight: If (TabMask AND tmRight <> 0) Then { Right arrow mask set }
  2516. Owner^.FocusNext(False) Else Exit; { Focus next view }
  2517. kbUp: If (TabMask AND tmUp <> 0) Then { Up arrow mask set }
  2518. Owner^.FocusNext(True) Else Exit; { Focus prior view }
  2519. kbDown: If (TabMask AND tmDown <> 0) Then { Down arrow mask set }
  2520. Owner^.FocusNext(False) Else Exit; { Focus next view }
  2521. Else Exit; { Not a tab key }
  2522. End;
  2523. ClearEvent(Event); { Clear handled events }
  2524. End;
  2525. End;
  2526. END;
  2527. {--TView--------------------------------------------------------------------}
  2528. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2529. {---------------------------------------------------------------------------}
  2530. PROCEDURE TView.ChangeBounds (Var Bounds: TRect);
  2531. BEGIN
  2532. SetBounds(Bounds); { Set new bounds }
  2533. DrawView; { Draw the view }
  2534. END;
  2535. {--TView--------------------------------------------------------------------}
  2536. { SizeLimits -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2537. {---------------------------------------------------------------------------}
  2538. PROCEDURE TView.SizeLimits (Var Min, Max: TPoint);
  2539. BEGIN
  2540. Min.X := 0; { Zero x minimum }
  2541. Min.Y := 0; { Zero y minimum }
  2542. If (Owner = Nil) Then Begin
  2543. Max.X := $7FFF; { Max possible x size }
  2544. Max.Y := $7FFF; { Max possible y size }
  2545. End Else Max := Owner^.Size; { Max owner size }
  2546. END;
  2547. {--TView--------------------------------------------------------------------}
  2548. { GetCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2549. {---------------------------------------------------------------------------}
  2550. PROCEDURE TView.GetCommands (Var Commands: TCommandSet);
  2551. BEGIN
  2552. Commands := CurCommandSet; { Return command set }
  2553. END;
  2554. {--TView--------------------------------------------------------------------}
  2555. { GetPeerViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2556. {---------------------------------------------------------------------------}
  2557. PROCEDURE TView.GetPeerViewPtr (Var S: TStream; Var P);
  2558. VAR Index: Integer;
  2559. BEGIN
  2560. Index := 0; { Zero index value }
  2561. S.Read(Index, 2); { Read view index }
  2562. If (Index = 0) OR (OwnerGroup = Nil) Then { Check for peer views }
  2563. Pointer(P) := Nil Else Begin { Return nil }
  2564. Pointer(P) := FixupList^[Index]; { New view ptr }
  2565. FixupList^[Index] := @P; { Patch this pointer }
  2566. End;
  2567. END;
  2568. {--TView--------------------------------------------------------------------}
  2569. { PutPeerViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2570. {---------------------------------------------------------------------------}
  2571. PROCEDURE TView.PutPeerViewPtr (Var S: TStream; P: PView);
  2572. VAR Index: Integer;
  2573. BEGIN
  2574. If (P = Nil) OR (OwnerGroup = Nil) Then Index := 0 { Return zero index }
  2575. Else Index := OwnerGroup^.IndexOf(P); { Return view index }
  2576. S.Write(Index, 2); { Write the index }
  2577. END;
  2578. {--TView--------------------------------------------------------------------}
  2579. { CalcBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2580. {---------------------------------------------------------------------------}
  2581. PROCEDURE TView.CalcBounds (Var Bounds: TRect; Delta: TPoint);
  2582. VAR S, D: Integer; Min, Max: TPoint;
  2583. FUNCTION Range (Val, Min, Max: Integer): Integer;
  2584. BEGIN
  2585. If (Val < Min) Then Range := Min Else { Value below min }
  2586. If (Val > Max) Then Range := Max Else { Value above max }
  2587. Range := Val; { Accept value }
  2588. END;
  2589. PROCEDURE Grow (Var I: Integer);
  2590. BEGIN
  2591. If (GrowMode AND gfGrowRel = 0) Then Inc(I, D)
  2592. Else I := (I * S + (S - D) SHR 1) DIV (S - D); { Calc grow value }
  2593. END;
  2594. BEGIN
  2595. GetBounds(Bounds); { Get bounds }
  2596. If (GrowMode = 0) Then Exit; { No grow flags exits }
  2597. S := Owner^.Size.X; { Set initial size }
  2598. D := Delta.X; { Set initial delta }
  2599. If (GrowMode AND gfGrowLoX <> 0) Then
  2600. Grow(Bounds.A.X); { Grow left side }
  2601. If (GrowMode AND gfGrowHiX <> 0) Then
  2602. Grow(Bounds.B.X); { Grow right side }
  2603. If (Bounds.B.X - Bounds.A.X > MaxViewWidth) Then
  2604. Bounds.B.X := Bounds.A.X + MaxViewWidth; { Check values }
  2605. S := Owner^.Size.Y; D := Delta.Y; { set initial values }
  2606. If (GrowMode AND gfGrowLoY <> 0) Then
  2607. Grow(Bounds.A.Y); { Grow top side }
  2608. If (GrowMode AND gfGrowHiY <> 0) Then
  2609. Grow(Bounds.B.Y); { grow lower side }
  2610. SizeLimits(Min, Max); { Check sizes }
  2611. Bounds.B.X := Bounds.A.X + Range(Bounds.B.X -
  2612. Bounds.A.X, Min.X, Max.X); { Set right side }
  2613. Bounds.B.Y := Bounds.A.Y + Range(Bounds.B.Y -
  2614. Bounds.A.Y, Min.Y, Max.Y); { Set lower side }
  2615. END;
  2616. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  2617. {***************************************************************************}
  2618. { TView OBJECT WIN/NT/OS2 ONLY METHODS }
  2619. {***************************************************************************}
  2620. {--TView--------------------------------------------------------------------}
  2621. { GetClassId -> Platforms WIN/NT/OS2 - Updated 29Jul99 LdB }
  2622. {---------------------------------------------------------------------------}
  2623. FUNCTION TView.GetClassId: LongInt;
  2624. BEGIN
  2625. GetClassId := 0; { No view class id }
  2626. END;
  2627. {--TView--------------------------------------------------------------------}
  2628. { GetClassName -> Platforms WIN/NT/OS2 - Updated 17Mar98 LdB }
  2629. {---------------------------------------------------------------------------}
  2630. FUNCTION TView.GetClassName: String;
  2631. BEGIN
  2632. GetClassName := TvViewClassName; { View class name }
  2633. END;
  2634. {--TView--------------------------------------------------------------------}
  2635. { GetClassText -> Platforms WIN/NT/OS2 - Updated 17Mar98 LdB }
  2636. {---------------------------------------------------------------------------}
  2637. FUNCTION TView.GetClassText: String;
  2638. BEGIN
  2639. GetClassText := ''; { Return empty string }
  2640. END;
  2641. {--TView--------------------------------------------------------------------}
  2642. { GetClassAttr -> Platforms WIN/NT/OS2 - Updated 17Mar98 LdB }
  2643. {---------------------------------------------------------------------------}
  2644. FUNCTION TView.GetClassAttr: LongInt;
  2645. VAR Li: LongInt;
  2646. BEGIN
  2647. If (State AND sfVisible = 0) Then Li := 0 { View not visible }
  2648. Else Li := ws_Visible; { View is visible }
  2649. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  2650. If (State AND sfDisabled <> 0) Then { Check disabled flag }
  2651. Li := Li OR ws_Disabled; { Set disabled flag }
  2652. If (GOptions AND goTitled <> 0) Then Begin
  2653. Li := Li OR ws_Caption; { View has a caption }
  2654. CaptSize := GetSystemMetrics(SM_CYCaption); { Caption height }
  2655. End;
  2656. If (GOptions AND goThickFramed <> 0) Then Begin
  2657. Li := Li OR ws_ThickFrame; { Thick frame on view }
  2658. FrameSize := GetSystemMetrics(SM_CXFrame); { Frame width }
  2659. If (GOptions AND goTitled = 0) Then
  2660. CaptSize := GetSystemMetrics(SM_CYFrame); { Frame height }
  2661. End Else If (Options AND ofFramed <> 0) Then Begin
  2662. Li := Li OR ws_Border; { Normal frame on view }
  2663. FrameSize := GetSystemMetrics(SM_CXBorder); { Frame width }
  2664. If (GOPtions AND goTitled = 0) Then
  2665. CaptSize := GetSystemMetrics(SM_CYBorder); { Frame height }
  2666. End;
  2667. {$ENDIF}
  2668. {$IFDEF OS_OS2} { OS2 CODE }
  2669. Li := Li OR fcf_NoByteAlign; { Not byte aligned }
  2670. If (GOptions AND goTitled <> 0) Then Begin
  2671. Li := Li OR fcf_TitleBar; { View has a caption }
  2672. CaptSize := WinQuerySysValue(HWND_Desktop,
  2673. SV_CYTitleBar); { Caption height }
  2674. End;
  2675. If (GOptions AND goThickFramed <> 0) Then Begin
  2676. Li := Li OR fcf_DlgBorder; { Thick frame on view }
  2677. FrameSize := WinQuerySysValue(HWND_DeskTop,
  2678. SV_CXSizeBorder); { Frame width }
  2679. CaptSize := CaptSize + WinQuerySysValue(
  2680. HWND_DeskTop, SV_CYSizeBorder); { Frame height }
  2681. End Else If (Options AND ofFramed <> 0) Then Begin
  2682. Li := Li OR fcf_Border; { Normal frame on view }
  2683. FrameSize := WinQuerySysValue(HWND_Desktop,
  2684. SV_CXBorder); { Frame width }
  2685. CaptSize := CaptSize + WinQuerySysValue(
  2686. HWND_DeskTop, SV_CYBorder); { Frame height }
  2687. End;
  2688. {$ENDIF}
  2689. Li := Li OR ws_ClipChildren OR ws_ClipSiblings; { By default clip others }
  2690. GetClassAttr := Li; { Return attributes }
  2691. END;
  2692. {--TView--------------------------------------------------------------------}
  2693. { GetNotifyCmd -> Platforms WIN/NT/OS2 - Updated 06Aug99 LdB }
  2694. {---------------------------------------------------------------------------}
  2695. FUNCTION TView.GetNotifyCmd: LongInt;
  2696. BEGIN
  2697. GetNotifyCmd := -1; { No notify cmd }
  2698. END;
  2699. {--TView--------------------------------------------------------------------}
  2700. { GetMsgHandler -> Platforms WIN/NT/OS2 - Updated 17Mar98 LdB }
  2701. {---------------------------------------------------------------------------}
  2702. FUNCTION TView.GetMsgHandler: Pointer;
  2703. BEGIN
  2704. GetMsgHandler := @TvViewMsgHandler; { Default msg handler }
  2705. END;
  2706. {$ENDIF}
  2707. {***************************************************************************}
  2708. { TView OBJECT PRIVATE METHODS }
  2709. {***************************************************************************}
  2710. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  2711. { TGroup OBJECT METHODS }
  2712. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  2713. {--TGroup-------------------------------------------------------------------}
  2714. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Jul99 LdB }
  2715. {---------------------------------------------------------------------------}
  2716. CONSTRUCTOR TGroup.Init (Var Bounds: TRect);
  2717. BEGIN
  2718. Inherited Init(Bounds); { Call ancestor }
  2719. Options := Options OR (ofSelectable + ofBuffered); { Set options }
  2720. GOptions := GOptions OR goNoDrawView; { Non drawing view }
  2721. GetExtent(Clip); { Get clip extents }
  2722. EventMask := $FFFF; { See all events }
  2723. GOptions := GOptions OR goTabSelect; { Set graphic options }
  2724. END;
  2725. {--TGroup-------------------------------------------------------------------}
  2726. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  2727. {---------------------------------------------------------------------------}
  2728. CONSTRUCTOR TGroup.Load (Var S: TStream);
  2729. VAR I, Count: Word; P, Q: ^Pointer; V: PView; OwnerSave: PGroup;
  2730. FixupSave: PFixupList;
  2731. BEGIN
  2732. Inherited Load(S); { Call ancestor }
  2733. GetExtent(Clip); { Get view extents }
  2734. OwnerSave := OwnerGroup; { Save current group }
  2735. OwnerGroup := @Self; { We are current group }
  2736. FixupSave := FixupList; { Save current list }
  2737. Count := 0; { Zero count value }
  2738. S.Read(Count, 2); { Read entry count }
  2739. If (MaxAvail >= Count*SizeOf(Pointer)) Then Begin { Memory available }
  2740. GetMem(FixupList, Count*SizeOf(Pointer)); { List size needed }
  2741. FillChar(FixUpList^, Count*SizeOf(Pointer), #0); { Zero all entries }
  2742. For I := 1 To Count Do Begin
  2743. V := PView(S.Get); { Get view off stream }
  2744. If (V <> Nil) Then InsertView(V, Nil); { Insert valid views }
  2745. End;
  2746. V := Last; { Start on last view }
  2747. For I := 1 To Count Do Begin
  2748. V := V^.Next; { Fetch next view }
  2749. P := FixupList^[I]; { Transfer pointer }
  2750. While (P <> Nil) Do Begin { If valid view }
  2751. Q := P; { Copy pointer }
  2752. P := P^; { Fetch pointer }
  2753. Q^ := V; { Transfer view ptr }
  2754. End;
  2755. End;
  2756. FreeMem(FixupList, Count*SizeOf(Pointer)); { Release fixup list }
  2757. End;
  2758. OwnerGroup := OwnerSave; { Reload current group }
  2759. FixupList := FixupSave; { Reload current list }
  2760. GetSubViewPtr(S, V); { Load any subviews }
  2761. SetCurrent(V, NormalSelect); { Select current view }
  2762. If (OwnerGroup = Nil) Then Awaken; { If topview activate }
  2763. END;
  2764. {--TGroup-------------------------------------------------------------------}
  2765. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2766. {---------------------------------------------------------------------------}
  2767. DESTRUCTOR TGroup.Done;
  2768. VAR P, T: PView;
  2769. BEGIN
  2770. Hide; { Hide the view }
  2771. P := Last; { Start on last }
  2772. If (P <> Nil) Then Begin { Subviews exist }
  2773. Repeat
  2774. P^.Hide; { Hide each view }
  2775. P := P^.Prev; { Prior view }
  2776. Until (P = Last); { Loop complete }
  2777. Repeat
  2778. T := P^.Prev; { Hold prior pointer }
  2779. Dispose(P, Done); { Dispose subview }
  2780. P := T; { Transfer pointer }
  2781. Until (Last = Nil); { Loop complete }
  2782. End;
  2783. Inherited Done; { Call ancestor }
  2784. END;
  2785. {--TGroup-------------------------------------------------------------------}
  2786. { First -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2787. {---------------------------------------------------------------------------}
  2788. FUNCTION TGroup.First: PView;
  2789. BEGIN
  2790. If (Last = Nil) Then First := Nil { No first view }
  2791. Else First := Last^.Next; { Return first view }
  2792. END;
  2793. {--TGroup-------------------------------------------------------------------}
  2794. { Execute -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2795. {---------------------------------------------------------------------------}
  2796. FUNCTION TGroup.Execute: Word;
  2797. VAR Event: TEvent;
  2798. BEGIN
  2799. Repeat
  2800. EndState := 0; { Clear end state }
  2801. Repeat
  2802. GetEvent(Event); { Get next event }
  2803. HandleEvent(Event); { Handle the event }
  2804. If (Event.What <> evNothing) Then
  2805. EventError(Event); { Event not handled }
  2806. Until (EndState <> 0); { Until command set }
  2807. Until Valid(EndState); { Repeat until valid }
  2808. Execute := EndState; { Return result }
  2809. EndState := 0; { Clear end state }
  2810. END;
  2811. {--TGroup-------------------------------------------------------------------}
  2812. { GetHelpCtx -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2813. {---------------------------------------------------------------------------}
  2814. FUNCTION TGroup.GetHelpCtx: Word;
  2815. VAR H: Word;
  2816. BEGIN
  2817. H := hcNoContext; { Preset no context }
  2818. If (Current <> Nil) Then H := Current^.GetHelpCtx; { Current context }
  2819. If (H=hcNoContext) Then H := Inherited GetHelpCtx; { Call ancestor }
  2820. GetHelpCtx := H; { Return result }
  2821. END;
  2822. {--TGroup-------------------------------------------------------------------}
  2823. { DataSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Jul98 LdB }
  2824. {---------------------------------------------------------------------------}
  2825. FUNCTION TGroup.DataSize: Word;
  2826. VAR Total: Word; P: PView;
  2827. BEGIN
  2828. Total := 0; { Zero totals count }
  2829. P := Last; { Start on last view }
  2830. If (P <> Nil) Then Begin { Subviews exist }
  2831. Repeat
  2832. P := P^.Next; { Move to next view }
  2833. Total := Total + P^.DataSize; { Add view size }
  2834. Until (P = Last); { Until last view }
  2835. End;
  2836. DataSize := Total; { Return data size }
  2837. END;
  2838. {--TGroup-------------------------------------------------------------------}
  2839. { ExecView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Jul99 LdB }
  2840. {---------------------------------------------------------------------------}
  2841. FUNCTION TGroup.ExecView (P: PView): Word;
  2842. VAR SaveOptions: Word; SaveTopView, SaveCurrent: PView; SaveOwner: PGroup;
  2843. SaveCommands: TCommandSet;
  2844. BEGIN
  2845. If (P<>Nil) Then Begin
  2846. SaveOptions := P^.Options; { Hold options }
  2847. SaveOwner := P^.Owner; { Hold owner }
  2848. SaveTopView := TheTopView; { Save topmost view }
  2849. SaveCurrent := Current; { Save current view }
  2850. GetCommands(SaveCommands); { Save commands }
  2851. TheTopView := P; { Set top view }
  2852. P^.Options := P^.Options AND NOT ofSelectable; { Not selectable }
  2853. P^.SetState(sfModal, True); { Make modal }
  2854. SetCurrent(P, EnterSelect); { Select next }
  2855. If (SaveOwner = Nil) Then Insert(P); { Insert view }
  2856. ExecView := P^.Execute; { Execute view }
  2857. If (SaveOwner = Nil) Then Delete(P); { Remove view }
  2858. SetCurrent(SaveCurrent, LeaveSelect); { Unselect current }
  2859. P^.SetState(sfModal, False); { Clear modal state }
  2860. P^.Options := SaveOptions; { Restore options }
  2861. TheTopView := SaveTopView; { Restore topview }
  2862. SetCommands(SaveCommands); { Restore commands }
  2863. End Else ExecView := cmCancel; { Return cancel }
  2864. END;
  2865. { ********************************* REMARK ******************************** }
  2866. { This call really is very COMPILER SPECIFIC and really can't be done }
  2867. { effectively any other way but assembler code as SELF & FRAMES need }
  2868. { to be put down in exact order and OPTIMIZERS make a mess of it. }
  2869. { ******************************** END REMARK *** Leon de Boer, 17Jul99 *** }
  2870. {--TGroup-------------------------------------------------------------------}
  2871. { FirstThat -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  2872. {---------------------------------------------------------------------------}
  2873. FUNCTION TGroup.FirstThat (P: Pointer): PView; ASSEMBLER;
  2874. {&USES EBX, ECX, ESI, EDI} {&FRAME-}
  2875. {$IFDEF BIT_16} VAR HoldLast: Pointer; {$ENDIF}
  2876. {$IFDEF BIT_16} { 16 BIT CODE }
  2877. ASM
  2878. LES DI, Self; { Load self pointer }
  2879. LES DI, ES:[DI].TGroup.Last; { Fetch last view }
  2880. MOV AX, ES;
  2881. OR AX, DI; { Check for nil }
  2882. JZ @@Exit; { No subviews exit }
  2883. MOV WORD PTR HoldLast[2], ES;
  2884. MOV WORD PTR HoldLast[0], DI; { Hold this last view }
  2885. @@LoopPoint:
  2886. LES DI, ES:[DI].TView.Next; { Move to next view }
  2887. PUSH ES; { * Save this view for }
  2888. PUSH DI; { post call to proc P * }
  2889. PUSH ES;
  2890. PUSH DI; { Push view for proc P }
  2891. MOV AX, [BP]; { Get our frame }
  2892. {$IFNDEF OS_DOS} { WIN/OS2 CODE }
  2893. AND AL, 0FEH; { Must be even }
  2894. {$ENDIF}
  2895. PUSH AX; { Push this frame }
  2896. CALL P; { Call the procedure P }
  2897. POP DI; { * Restore the view }
  2898. POP ES; { we saved above * }
  2899. OR AL, AL; { Look for true result }
  2900. JNZ @@TrueReturned; { Branch if true }
  2901. CMP DI, WORD PTR HoldLast[0]; { HoldLast ofs match? }
  2902. JNZ @@LoopPoint; { No match the continue }
  2903. MOV AX, ES;
  2904. CMP AX, WORD PTR HoldLast[2]; { HoldLast seg match? }
  2905. JNZ @@LoopPoint; { No match continue }
  2906. XOR DI, DI;
  2907. MOV ES, DI; { No matches return nil }
  2908. @@TrueReturned:
  2909. MOV SP, BP; { Restore stack pointer }
  2910. @@Exit:
  2911. MOV AX, DI;
  2912. MOV DX, ES; { Return result pointer }
  2913. END;
  2914. {$ENDIF}
  2915. {$IFDEF BIT_32} { 32 BIT CODE }
  2916. {$IFNDEF PPC_FPC} { NONE FPC COMPILERS }
  2917. ASM
  2918. MOV EAX, Self; { Fetch self pointer }
  2919. MOV EAX, [EAX].TGroup.Last; { Fetch last view }
  2920. OR EAX, EAX; { Check for nil }
  2921. JZ @@Exit; { No subviews exit }
  2922. MOV ECX, EAX; { Hold this last view }
  2923. MOV EBX, P; { Procedure to call }
  2924. @@LoopPoint:
  2925. MOV EAX, [EAX].TView.Next; { Fetch next view }
  2926. PUSH ECX; { Save holdlast view }
  2927. PUSH EBX; { Save procedure address }
  2928. PUSH EAX; { Save for recovery }
  2929. PUSH EAX; { [1]:Pointer = PView }
  2930. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL 2.0+ }
  2931. DB $66;
  2932. DB $FF;
  2933. DB $D1; { Doesn't know CALL ECX }
  2934. {$ELSE}
  2935. CALL EBX; { Call the test function }
  2936. {$ENDIF}
  2937. TEST AL, AL; { True result check }
  2938. POP EAX; { PView recovered }
  2939. POP EBX; { Restore procedure addr }
  2940. POP ECX; { Restore holdlast view }
  2941. JNZ @@Exit; { Exit if true }
  2942. CMP EAX, ECX; { Check if last view }
  2943. JNZ @@LoopPoint; { Reloop if not last }
  2944. XOR EAX, EAX; { No matches return nil }
  2945. @@Exit:
  2946. END;
  2947. {$ELSE} { FPC COMPILER }
  2948. ASM
  2949. MOVL 8(%EBP), %ESI; { Self pointer }
  2950. MOVL TGroup.Last(%ESI), %EAX; { Load last view }
  2951. ORL %EAX, %EAX; { Check for nil }
  2952. JZ .L_Exit; { No subviews exit }
  2953. MOVL %EAX, %ECX; { Hold last view }
  2954. MOVL P, %EBX; { Procedure to call }
  2955. .L_LoopPoint:
  2956. MOVL TView.Next(%EAX), %EAX; { Fetch next pointer }
  2957. PUSHL %ECX; { Save holdlast view }
  2958. PUSHL %EBX; { Save procedure address }
  2959. PUSHL %EAX; { Save for recovery }
  2960. PUSHL %EAX; { PView pushed }
  2961. MOVL (%EBP), %EAX; { Fetch self ptr }
  2962. PUSH %EAX; { Push self ptr }
  2963. CALL %EBX; { Call the procedure }
  2964. ORB %AL, %AL; { Test for true }
  2965. POPL %EAX; { Recover next PView }
  2966. POPL %EBX; { Restore procedure addr }
  2967. POPL %ECX; { Restore holdlast view }
  2968. JNZ .L_Exit; { Call returned true }
  2969. CMPL %ECX, %EAX; { Check if last view }
  2970. JNZ .L_LoopPoint; { Continue to last }
  2971. XOR %EAX, %EAX; { No views gave true }
  2972. .L_Exit:
  2973. MOVL %EAX, -4(%EBP); { Return result }
  2974. END;
  2975. {$ENDIF}
  2976. {$ENDIF}
  2977. {--TGroup-------------------------------------------------------------------}
  2978. { Valid -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2979. {---------------------------------------------------------------------------}
  2980. FUNCTION TGroup.Valid (Command: Word): Boolean;
  2981. FUNCTION IsInvalid (P: PView): Boolean; FAR;
  2982. BEGIN
  2983. IsInvalid := NOT P^.Valid(Command); { Check if valid }
  2984. END;
  2985. BEGIN
  2986. Valid := True; { Preset valid }
  2987. If (Command = cmReleasedFocus) Then Begin { Release focus cmd }
  2988. If (Current <> Nil) AND { Current view exists }
  2989. (Current^.Options AND ofValidate <> 0) Then { Validating view }
  2990. Valid := Current^.Valid(Command); { Validate command }
  2991. End Else Valid := FirstThat(@IsInvalid) = Nil; { Check first valid }
  2992. END;
  2993. {--TGroup-------------------------------------------------------------------}
  2994. { FocusNext -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2995. {---------------------------------------------------------------------------}
  2996. FUNCTION TGroup.FocusNext (Forwards: Boolean): Boolean;
  2997. VAR P: PView;
  2998. BEGIN
  2999. P := FindNext(Forwards); { Find next view }
  3000. FocusNext := True; { Preset true }
  3001. If (P <> Nil) Then FocusNext := P^.Focus; { Check next focus }
  3002. END;
  3003. {--TGroup-------------------------------------------------------------------}
  3004. { Draw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  3005. {---------------------------------------------------------------------------}
  3006. PROCEDURE TGroup.Draw;
  3007. VAR P: PView;
  3008. BEGIN
  3009. If (DrawMask AND vdNoChild = 0) Then Begin { No draw child clear }
  3010. P := Last; { Start on Last }
  3011. While (P <> Nil) Do Begin
  3012. P^.DrawView; { Redraw each subview }
  3013. P := P^.PrevView; { Move to prior view }
  3014. End;
  3015. End;
  3016. END;
  3017. {--TGroup-------------------------------------------------------------------}
  3018. { Awaken -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  3019. {---------------------------------------------------------------------------}
  3020. PROCEDURE TGroup.Awaken;
  3021. PROCEDURE DoAwaken (P: PView); FAR;
  3022. BEGIN
  3023. If (P <> Nil) Then P^.Awaken; { Awaken view }
  3024. END;
  3025. BEGIN
  3026. ForEach(@DoAwaken); { Awaken each view }
  3027. END;
  3028. {--TGroup-------------------------------------------------------------------}
  3029. { ReDraw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  3030. {---------------------------------------------------------------------------}
  3031. PROCEDURE TGroup.ReDraw;
  3032. BEGIN
  3033. DrawView; { For compatability }
  3034. END;
  3035. {--TGroup-------------------------------------------------------------------}
  3036. { SelectDefaultView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  3037. {---------------------------------------------------------------------------}
  3038. PROCEDURE TGroup.SelectDefaultView;
  3039. VAR P: PView;
  3040. BEGIN
  3041. P := Last; { Start at last }
  3042. While (P <> Nil) Do Begin
  3043. If P^.GetState(sfDefault) Then Begin { Search 1st default }
  3044. P^.Select; { Select default view }
  3045. P := Nil; { Force kick out }
  3046. End Else P := P^.PrevView; { Prior subview }
  3047. End;
  3048. END;
  3049. {--TGroup-------------------------------------------------------------------}
  3050. { Insert -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  3051. {---------------------------------------------------------------------------}
  3052. PROCEDURE TGroup.Insert (P: PView);
  3053. BEGIN
  3054. If (P <> Nil) Then { View is valid }
  3055. If (Options AND ofGFVModeView <> 0) Then { GFV mode view check }
  3056. P^.DisplaceBy(RawOrigin.X, RawOrigin.Y) Else { We are in GFV mode }
  3057. P^.DisplaceBy(Origin.X*FontWidth,
  3058. Origin.Y*FontHeight); { Displace old view }
  3059. InsertBefore(P, First); { Insert the view }
  3060. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  3061. If (HWindow <> 0) Then { We are created }
  3062. If (P^.HWindow = 0) Then { Child not created }
  3063. P^.CreateWindowNow(0); { Create child window }
  3064. {$ENDIF}
  3065. END;
  3066. {--TGroup-------------------------------------------------------------------}
  3067. { Delete -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3068. {---------------------------------------------------------------------------}
  3069. PROCEDURE TGroup.Delete (P: PView);
  3070. VAR SaveState: Word;
  3071. BEGIN
  3072. SaveState := P^.State; { Save state }
  3073. P^.Hide; { Hide the view }
  3074. RemoveView(P); { Remove the view }
  3075. P^.Owner := Nil; { Clear owner ptr }
  3076. P^.Next := Nil; { Clear next ptr }
  3077. If (SaveState AND sfVisible <> 0) Then P^.Show; { Show view }
  3078. END;
  3079. { ********************************* REMARK ******************************** }
  3080. { This call really is very COMPILER SPECIFIC and really can't be done }
  3081. { effectively any other way but assembler code as SELF & FRAMES need }
  3082. { to be put down in exact order and OPTIMIZERS make a mess of it. }
  3083. { ******************************** END REMARK *** Leon de Boer, 17Jul99 *** }
  3084. {--TGroup-------------------------------------------------------------------}
  3085. { ForEach -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  3086. {---------------------------------------------------------------------------}
  3087. PROCEDURE TGroup.ForEach (P: Pointer); ASSEMBLER;
  3088. {&USES EBX, ECX, EDI} {&FRAME-}
  3089. VAR HoldLast: Pointer;
  3090. {$IFDEF BIT_16} { 16 BIT CODE }
  3091. ASM
  3092. LES DI, Self; { Load self pointer }
  3093. LES DI, ES:[DI].TGroup.Last; { Fetch last view }
  3094. MOV AX, ES;
  3095. OR AX, DI; { Check for nil }
  3096. JZ @@Exit; { No subviews exit }
  3097. MOV WORD PTR HoldLast[2], ES;
  3098. MOV WORD PTR HoldLast[0], DI; { Hold this last view }
  3099. LES DI, ES:[DI].TView.Next; { Move to next view }
  3100. @@LoopPoint:
  3101. CMP DI, WORD PTR HoldLast[0]; { HoldLast ofs match? }
  3102. JNZ @@2; { No match continue }
  3103. MOV AX, ES;
  3104. CMP AX, WORD PTR HoldLast[2]; { HoldLast seg match? }
  3105. JZ @@3; { Branch if last }
  3106. @@2:
  3107. PUSH WORD PTR ES:[DI].TView.Next[2]; { * Save this view }
  3108. PUSH WORD PTR ES:[DI].TView.Next[0]; { for recovery later * }
  3109. PUSH ES;
  3110. PUSH DI; { Push view to test }
  3111. MOV AX, [BP]; { Get our frame }
  3112. {$IFNDEF OS_DOS} { WIN/OS2 CODE }
  3113. AND AL, 0FEH; { Must be even }
  3114. {$ENDIF}
  3115. PUSH AX; { Push our frame }
  3116. CALL P; { Call the proc P }
  3117. POP DI; { * Recover the view }
  3118. POP ES; { we saved earlier * }
  3119. JMP @@LoopPoint; { Continue on }
  3120. @@3:
  3121. MOV AX, [BP]; { Get our frame }
  3122. {$IFNDEF OS_DOS} { WIN/OS2 CODE }
  3123. AND AL, 0FEH; { Must be even }
  3124. {$ENDIF}
  3125. PUSH AX; { Push our frame }
  3126. CALL P; { Call the proc P }
  3127. @@Exit:
  3128. END;
  3129. {$ENDIF}
  3130. {$IFDEF BIT_32} { 32 BIT CODE }
  3131. {$IFNDEF PPC_FPC} { NON FPC COMPILERS }
  3132. ASM
  3133. MOV ECX, Self; { Load self pointer }
  3134. MOV ECX, [ECX].TGroup.Last; { Fetch last view }
  3135. OR ECX, ECX; { Check for nil }
  3136. JZ @@Exit; { No subviews exit }
  3137. MOV HoldLast, ECX; { Hold last view }
  3138. MOV ECX, [ECX].TView.Next; { Fetch next pointer }
  3139. MOV EBX, P; { Fetch proc address }
  3140. @@LoopPoint:
  3141. CMP ECX, HoldLast; { Check if last view }
  3142. JZ @@2; { Branch if last view }
  3143. MOV EAX, [ECX].TView.Next; { Fetch next view }
  3144. PUSH EBX; { Save procedure address }
  3145. PUSH EAX; { Save next view }
  3146. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILER }
  3147. MOV EAX, ECX; { Use register parameter }
  3148. MOV ESI, ECX;
  3149. {$ELSE} { OTHER COMPILERS }
  3150. PUSH ECX; { Push view to do }
  3151. {$ENDIF}
  3152. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL 2.0+ }
  3153. DB $66;
  3154. DB $FF;
  3155. DB $D3; { Can't do CALL EBX }
  3156. {$ELSE}
  3157. CALL EBX; { Call the proc P }
  3158. {$ENDIF}
  3159. POP ECX; { Recover saved view }
  3160. POP EBX; { Recover procedure addr }
  3161. JMP @@LoopPoint; { Continue on }
  3162. @@2:
  3163. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILERS }
  3164. MOV EAX, ECX; { Use register parameter }
  3165. {$ELSE} { OTHER COMPILERS }
  3166. PUSH ECX; { Push view to do }
  3167. {$ENDIF}
  3168. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL 2.0+ }
  3169. DB $66;
  3170. DB $FF;
  3171. DB $D3; { Can't do CALL EBX }
  3172. {$ELSE}
  3173. CALL EBX; { Call the proc P }
  3174. {$ENDIF}
  3175. @@Exit:
  3176. END;
  3177. {$ELSE} { FPC COMPILER }
  3178. ASM
  3179. MOVL 8(%EBP), %ESI; { Self pointer }
  3180. MOVL TGroup.Last(%ESI), %ECX; { Load last view }
  3181. ORL %ECX, %ECX; { Check for nil }
  3182. JZ .L_Exit; { No subviews exit }
  3183. MOVL %ECX, HOLDLAST; { Hold last view }
  3184. MOVL TView.Next(%ECX), %ECX; { Fetch next pointer }
  3185. .L_LoopPoint:
  3186. MOVL P, %EBX; { Fetch proc address }
  3187. CMPL HOLDLAST, %ECX; { Check if last view }
  3188. JZ .L_2; { Exit if last view }
  3189. MOVL TView.Next(%ECX), %EAX; { Fetch next pointer }
  3190. PUSHL %EAX; { Save next view ptr }
  3191. PUSHL %ECX; { Push view to do }
  3192. MOVL (%EBP), %EAX;
  3193. PUSH %EAX;
  3194. CALL %EBX; { Call the procedure }
  3195. POPL %ECX; { Recover next view }
  3196. JMP .L_LoopPoint; { Redo loop }
  3197. .L_2:
  3198. PUSHL %ECX; { Push view to do }
  3199. MOVL (%EBP), %EAX;
  3200. PUSH %EAX;
  3201. CALL %EBX; { Call the procedure }
  3202. .L_Exit:
  3203. END;
  3204. {$ENDIF}
  3205. {$ENDIF}
  3206. {--TGroup-------------------------------------------------------------------}
  3207. { EndModal -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3208. {---------------------------------------------------------------------------}
  3209. PROCEDURE TGroup.EndModal (Command: Word);
  3210. BEGIN
  3211. If (State AND sfModal <> 0) Then { This view is modal }
  3212. EndState := Command Else { Set endstate }
  3213. Inherited EndModal(Command); { Call ancestor }
  3214. END;
  3215. {--TGroup-------------------------------------------------------------------}
  3216. { DisplaceBy -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15May98 LdB }
  3217. {---------------------------------------------------------------------------}
  3218. PROCEDURE TGroup.DisplaceBy (Dx, Dy: Integer);
  3219. VAR P: PView;
  3220. BEGIN
  3221. P := First; { Get first view }
  3222. While (P <> Nil) Do Begin
  3223. P^.DisplaceBy(Dx, Dy); { Displace subviews }
  3224. P := P^.NextView; { Next view }
  3225. End;
  3226. Inherited DisplaceBy(Dx, Dy); { Call ancestor }
  3227. END;
  3228. {--TGroup-------------------------------------------------------------------}
  3229. { SelectNext -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  3230. {---------------------------------------------------------------------------}
  3231. PROCEDURE TGroup.SelectNext (Forwards: Boolean);
  3232. VAR P: PView;
  3233. BEGIN
  3234. P := FindNext(Forwards); { Find next view }
  3235. If (P <> Nil) Then P^.Select; { Select view }
  3236. END;
  3237. {--TGroup-------------------------------------------------------------------}
  3238. { InsertBefore -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  3239. {---------------------------------------------------------------------------}
  3240. PROCEDURE TGroup.InsertBefore (P, Target: PView);
  3241. VAR SaveState, I: Word;
  3242. BEGIN
  3243. If (P <> Nil) AND (P^.Owner = Nil) AND { View valid }
  3244. ((Target = Nil) OR (Target^.Owner = @Self)) { Target valid }
  3245. Then Begin
  3246. If (P^.Options AND ofCenterX <> 0) Then Begin { Centre on x axis }
  3247. If (Options AND ofGFVModeView <> 0) Then { GFV mode view check }
  3248. I := RawSize.X Else I := Size.X * FontWidth; { Calc owner x size }
  3249. If (P^.Options AND ofGFVModeView <> 0) { GFV mode view check }
  3250. Then Begin
  3251. I := (I - P^.RawSize.X) DIV 2; { Calc view offset }
  3252. I := I - P^.RawOrigin.X; { Subtract x origin }
  3253. End Else Begin
  3254. I := (I - (P^.Size.X * FontWidth)) DIV 2; { Calc view offset }
  3255. I := I - (P^.Origin.X * FontWidth); { Subtract x origin }
  3256. End;
  3257. P^.DisplaceBy(I, 0); { Displace the view }
  3258. End;
  3259. If (P^.Options AND ofCenterY <> 0) Then Begin { Centre on y axis }
  3260. If (Options AND ofGFVModeView <> 0) Then { GFV mode view check }
  3261. I := RawSize.Y Else I := Size.Y * FontHeight;{ Calc owner y size }
  3262. If (P^.Options AND ofGFVModeView <> 0) { GFV mode view check }
  3263. Then Begin
  3264. I := (I - P^.RawSize.Y) DIV 2; { Calc view offset }
  3265. I := I - P^.RawOrigin.Y; { Subtract y origin }
  3266. End Else Begin
  3267. I := (I - (P^.Size.Y * FontHeight)) DIV 2; { Calc view offset }
  3268. I := I - (P^.Origin.Y * FontHeight); { Subtract y origin }
  3269. End;
  3270. P^.DisplaceBy(0, I); { Displace the view }
  3271. End;
  3272. SaveState := P^.State; { Save view state }
  3273. P^.Hide; { Make sure hidden }
  3274. InsertView(P, Target); { Insert into list }
  3275. If (SaveState AND sfVisible <> 0) Then P^.Show; { Show the view }
  3276. If (State AND sfActive <> 0) Then { Was active before }
  3277. P^.SetState(sfActive , True); { Make active again }
  3278. End;
  3279. END;
  3280. {--TGroup-------------------------------------------------------------------}
  3281. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3282. {---------------------------------------------------------------------------}
  3283. PROCEDURE TGroup.SetState (AState: Word; Enable: Boolean);
  3284. PROCEDURE DoSetState (P: PView); FAR;
  3285. BEGIN
  3286. If (P <> Nil) Then P^.SetState(AState, Enable); { Set subview state }
  3287. END;
  3288. PROCEDURE DoExpose (P: PView); FAR;
  3289. BEGIN
  3290. If (P <> Nil) Then Begin
  3291. If (P^.State AND sfVisible <> 0) Then { Check view visible }
  3292. P^.SetState(sfExposed, Enable); { Set exposed flag }
  3293. End;
  3294. END;
  3295. BEGIN
  3296. Inherited SetState(AState, Enable); { Call ancestor }
  3297. Case AState Of
  3298. sfActive, sfDragging: Begin
  3299. Lock; { Lock the view }
  3300. ForEach(@DoSetState); { Set each subview }
  3301. UnLock; { Unlock the view }
  3302. End;
  3303. sfFocused: If (Current <> Nil) Then
  3304. Current^.SetState(sfFocused, Enable); { Focus current view }
  3305. sfExposed: Begin
  3306. ForEach(@DoExpose); { Expose each subview }
  3307. End;
  3308. End;
  3309. END;
  3310. {--TGroup-------------------------------------------------------------------}
  3311. { GetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Mar98 LdB }
  3312. {---------------------------------------------------------------------------}
  3313. PROCEDURE TGroup.GetData (Var Rec);
  3314. VAR Total: Word; P: PView;
  3315. BEGIN
  3316. Total := 0; { Clear total }
  3317. P := Last; { Start at last }
  3318. While (P <> Nil) Do Begin { Subviews exist }
  3319. P^.GetData(TByteArray(Rec)[Total]); { Get data }
  3320. Inc(Total, P^.DataSize); { Increase total }
  3321. P := P^.PrevView; { Previous view }
  3322. End;
  3323. END;
  3324. {--TGroup-------------------------------------------------------------------}
  3325. { SetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Mar98 LdB }
  3326. {---------------------------------------------------------------------------}
  3327. PROCEDURE TGroup.SetData (Var Rec);
  3328. VAR Total: Word; P: PView;
  3329. BEGIN
  3330. Total := 0; { Clear total }
  3331. P := Last; { Start at last }
  3332. While (P <> Nil) Do Begin { Subviews exist }
  3333. P^.SetData(TByteArray(Rec)[Total]); { Get data }
  3334. Inc(Total, P^.DataSize); { Increase total }
  3335. P := P^.PrevView; { Previous view }
  3336. End;
  3337. END;
  3338. {--TGroup-------------------------------------------------------------------}
  3339. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Mar98 LdB }
  3340. {---------------------------------------------------------------------------}
  3341. PROCEDURE TGroup.Store (Var S: TStream);
  3342. VAR Count: Integer; OwnerSave: PGroup;
  3343. PROCEDURE DoPut (P: PView); FAR;
  3344. BEGIN
  3345. S.Put(P); { Put view on stream }
  3346. END;
  3347. BEGIN
  3348. TView.Store(S); { Call view store }
  3349. OwnerSave := OwnerGroup; { Save ownergroup }
  3350. OwnerGroup := @Self; { Set as owner group }
  3351. Count := IndexOf(Last); { Subview count }
  3352. S.Write(Count, 2); { Write the count }
  3353. ForEach(@DoPut); { Put each in stream }
  3354. PutSubViewPtr(S, Current); { Current on stream }
  3355. OwnerGroup := OwnerSave; { Restore ownergroup }
  3356. END;
  3357. {--TGroup-------------------------------------------------------------------}
  3358. { EventError -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3359. {---------------------------------------------------------------------------}
  3360. PROCEDURE TGroup.EventError (Var Event: TEvent);
  3361. BEGIN
  3362. If (Owner <> Nil) Then Owner^.EventError(Event); { Event error }
  3363. END;
  3364. {--TGroup-------------------------------------------------------------------}
  3365. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3366. {---------------------------------------------------------------------------}
  3367. PROCEDURE TGroup.HandleEvent (Var Event: TEvent);
  3368. FUNCTION ContainsMouse (P: PView): Boolean; FAR;
  3369. BEGIN
  3370. ContainsMouse := (P^.State AND sfVisible <> 0) { Is view visible }
  3371. AND P^.MouseInView(Event.Where); { Is point in view }
  3372. END;
  3373. PROCEDURE DoHandleEvent (P: PView); FAR;
  3374. BEGIN
  3375. If (P = Nil) OR ((P^.State AND sfDisabled <> 0) AND
  3376. (Event.What AND(PositionalEvents OR FocusedEvents) <>0 ))
  3377. Then Exit; { Invalid/disabled }
  3378. Case Phase Of
  3379. phPreProcess: If (P^.Options AND ofPreProcess = 0)
  3380. Then Exit; { Not pre processing }
  3381. phPostProcess: If (P^.Options AND ofPostProcess = 0)
  3382. Then Exit; { Not post processing }
  3383. End;
  3384. If (Event.What AND P^.EventMask <> 0) Then { View handles event }
  3385. P^.HandleEvent(Event); { Pass to view }
  3386. END;
  3387. BEGIN
  3388. Inherited HandleEvent(Event); { Call ancestor }
  3389. If (Event.What = evNothing) Then Exit; { No valid event exit }
  3390. If (Event.What AND FocusedEvents <> 0) Then Begin { Focused event }
  3391. Phase := phPreProcess; { Set pre process }
  3392. ForEach(@DoHandleEvent); { Pass to each view }
  3393. Phase := phFocused; { Set focused }
  3394. DoHandleEvent(Current); { Pass to current }
  3395. Phase := phPostProcess; { Set post process }
  3396. ForEach(@DoHandleEvent); { Pass to each }
  3397. End Else Begin
  3398. Phase := phFocused; { Set focused }
  3399. If (Event.What AND PositionalEvents <> 0) Then { Positional event }
  3400. DoHandleEvent(FirstThat(@ContainsMouse)) { Pass to first }
  3401. Else ForEach(@DoHandleEvent); { Pass to all }
  3402. End;
  3403. END;
  3404. {--TGroup-------------------------------------------------------------------}
  3405. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3406. {---------------------------------------------------------------------------}
  3407. PROCEDURE TGroup.ChangeBounds (Var Bounds: TRect);
  3408. VAR D: TPoint;
  3409. PROCEDURE DoCalcChange (P: PView); FAR;
  3410. VAR R: TRect;
  3411. BEGIN
  3412. P^.CalcBounds(R, D); { Calc view bounds }
  3413. P^.ChangeBounds(R); { Change view bounds }
  3414. END;
  3415. BEGIN
  3416. D.X := Bounds.B.X - Bounds.A.X - Size.X; { Delta x value }
  3417. D.Y := Bounds.B.Y - Bounds.A.Y - Size.Y; { Delta y value }
  3418. If ((D.X=0) AND (D.Y=0)) Then Begin
  3419. SetBounds(Bounds); { Set new bounds }
  3420. DrawView; { Draw the view }
  3421. End Else Begin
  3422. SetBounds(Bounds); { Set new bounds }
  3423. GetExtent(Clip); { Get new clip extents }
  3424. Lock; { Lock drawing }
  3425. ForEach(@DoCalcChange); { Change each view }
  3426. UnLock; { Unlock drawing }
  3427. End;
  3428. END;
  3429. {--TGroup-------------------------------------------------------------------}
  3430. { GetSubViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20May98 LdB }
  3431. {---------------------------------------------------------------------------}
  3432. PROCEDURE TGroup.GetSubViewPtr (Var S: TStream; Var P);
  3433. VAR Index, I: Word; Q: PView;
  3434. BEGIN
  3435. Index := 0; { Zero index value }
  3436. S.Read(Index, 2); { Read view index }
  3437. If (Index > 0) Then Begin { Valid index }
  3438. Q := Last; { Start on last }
  3439. For I := 1 To Index Do Q := Q^.Next; { Loop for count }
  3440. Pointer(P) := Q; { Return the view }
  3441. End Else Pointer(P) := Nil; { Return nil }
  3442. END;
  3443. {--TGroup-------------------------------------------------------------------}
  3444. { PutSubViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20May98 LdB }
  3445. {---------------------------------------------------------------------------}
  3446. PROCEDURE TGroup.PutSubViewPtr (Var S: TStream; P: PView);
  3447. VAR Index: Word;
  3448. BEGIN
  3449. If (P = Nil) Then Index := 0 Else { Nil view, Index = 0 }
  3450. Index := IndexOf(P); { Calc view index }
  3451. S.Write(Index, 2); { Write the index }
  3452. END;
  3453. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  3454. {***************************************************************************}
  3455. { TGroup OBJECT WIN/NT/OS2 ONLY METHODS }
  3456. {***************************************************************************}
  3457. {--TGroup-------------------------------------------------------------------}
  3458. { CreateWindowNow -> Platforms WIN/NT/OS2 - Updated 23Mar98 LdB }
  3459. {---------------------------------------------------------------------------}
  3460. PROCEDURE TGroup.CreateWindowNow (CmdShow: Integer);
  3461. VAR P: PView;
  3462. BEGIN
  3463. Inherited CreateWindowNow (CmdShow); { Call ancestor }
  3464. P := Last; { Start on Last }
  3465. While (P <> Nil) Do Begin
  3466. If (P^.HWindow = 0) Then { No window created }
  3467. P^.CreateWindowNow(0); { Create each subview }
  3468. P := P^.PrevView; { Move to prev view }
  3469. End;
  3470. END;
  3471. {$ENDIF}
  3472. {***************************************************************************}
  3473. { TGroup OBJECT PRIVATE METHODS }
  3474. {***************************************************************************}
  3475. {--TGroup-------------------------------------------------------------------}
  3476. { IndexOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3477. {---------------------------------------------------------------------------}
  3478. FUNCTION TGroup.IndexOf (P: PView): Integer;
  3479. VAR I: Integer; Q: PView;
  3480. BEGIN
  3481. Q := Last; { Start on last view }
  3482. If (Q <> Nil) Then Begin { Subviews exist }
  3483. I := 1; { Preset value }
  3484. While (Q <> P) AND (Q^.Next <> Last) Do Begin
  3485. Q := Q^.Next; { Load next view }
  3486. Inc(I); { Increment count }
  3487. End;
  3488. If (Q <> P) Then IndexOf := 0 Else IndexOf := I; { Return index }
  3489. End Else IndexOf := 0; { Return zero }
  3490. END;
  3491. {--TGroup-------------------------------------------------------------------}
  3492. { FindNext -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep99 LdB }
  3493. {---------------------------------------------------------------------------}
  3494. FUNCTION TGroup.FindNext (Forwards: Boolean): PView;
  3495. VAR P: PView;
  3496. BEGIN
  3497. FindNext := Nil; { Preset nil return }
  3498. If (Current <> Nil) Then Begin { Has current view }
  3499. P := Current; { Start on current }
  3500. Repeat
  3501. If Forwards Then P := P^.Next { Get next view }
  3502. Else P := P^.Prev; { Get prev view }
  3503. Until ((P^.State AND (sfVisible+sfDisabled) = sfVisible)
  3504. AND ((P^.Options AND ofSelectable <> 0) AND { Selectable }
  3505. (P^.GOptions AND goTabSelect <> 0))) OR { Tab selectable }
  3506. (P = Current); { Not singular select }
  3507. If (P <> Current) Then FindNext := P; { Return result }
  3508. End;
  3509. END;
  3510. {--TGroup-------------------------------------------------------------------}
  3511. { FirstMatch -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3512. {---------------------------------------------------------------------------}
  3513. FUNCTION TGroup.FirstMatch (AState: Word; AOptions: Word): PView;
  3514. FUNCTION Matches (P: PView): Boolean; FAR;
  3515. BEGIN
  3516. Matches := (P^.State AND AState = AState) AND
  3517. (P^.Options AND AOptions = AOptions); { Return match state }
  3518. END;
  3519. BEGIN
  3520. FirstMatch := FirstThat(@Matches); { Return first match }
  3521. END;
  3522. {--TGroup-------------------------------------------------------------------}
  3523. { ResetCurrent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3524. {---------------------------------------------------------------------------}
  3525. PROCEDURE TGroup.ResetCurrent;
  3526. BEGIN
  3527. SetCurrent(FirstMatch(sfVisible, ofSelectable),
  3528. NormalSelect); { Reset current view }
  3529. END;
  3530. {--TGroup-------------------------------------------------------------------}
  3531. { RemoveView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3532. {---------------------------------------------------------------------------}
  3533. PROCEDURE TGroup.RemoveView (P: PView);
  3534. VAR Q: PView;
  3535. BEGIN
  3536. If (P <> Nil) AND (Last <> Nil) Then Begin { Check view is valid }
  3537. Q := Last; { Start on last view }
  3538. While (Q^.Next <> P) AND (Q^.Next <> Last) Do
  3539. Q := Q^.Next; { Find prior view }
  3540. If (Q^.Next = P) Then Begin { View found }
  3541. If (Q^.Next <> Q) Then Begin { Not only view }
  3542. Q^.Next := P^.Next; { Rechain views }
  3543. If (P = Last) Then Last := P^.Next; { Fix if last removed }
  3544. End Else Last := Nil; { Only view }
  3545. End;
  3546. End;
  3547. END;
  3548. {--TGroup-------------------------------------------------------------------}
  3549. { InsertView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3550. {---------------------------------------------------------------------------}
  3551. PROCEDURE TGroup.InsertView (P, Target: PView);
  3552. BEGIN
  3553. If (P <> Nil) Then Begin { Check view is valid }
  3554. P^.Owner := @Self; { Views owner is us }
  3555. If (Target <> Nil) Then Begin { Valid target }
  3556. Target := Target^.Prev; { 1st part of chain }
  3557. P^.Next := Target^.Next; { 2nd part of chain }
  3558. Target^.Next := P; { Chain completed }
  3559. End Else Begin
  3560. If (Last <> Nil) Then Begin { Not first view }
  3561. P^.Next := Last^.Next; { 1st part of chain }
  3562. Last^.Next := P; { Completed chain }
  3563. End Else P^.Next := P; { 1st chain to self }
  3564. Last := P; { P is now last }
  3565. End;
  3566. End;
  3567. END;
  3568. {--TGroup-------------------------------------------------------------------}
  3569. { SetCurrent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep99 LdB }
  3570. {---------------------------------------------------------------------------}
  3571. PROCEDURE TGroup.SetCurrent (P: PView; Mode: SelectMode);
  3572. PROCEDURE SelectView (P: PView; Enable: Boolean);
  3573. BEGIN
  3574. If (P <> Nil) Then { View is valid }
  3575. P^.SetState(sfSelected, Enable); { Select the view }
  3576. END;
  3577. PROCEDURE FocusView (P: PView; Enable: Boolean);
  3578. BEGIN
  3579. If (State AND sfFocused <> 0) AND (P <> Nil) { Check not focused }
  3580. Then P^.SetState(sfFocused, Enable); { Focus the view }
  3581. END;
  3582. BEGIN
  3583. If (Current<>P) Then Begin { Not already current }
  3584. Lock; { Stop drawing }
  3585. FocusView(Current, False); { Defocus current }
  3586. If (Mode <> EnterSelect) Then
  3587. SelectView(Current, False); { Deselect current }
  3588. If (Mode<>LeaveSelect) Then SelectView(P, True); { Select view P }
  3589. FocusView(P, True); { Focus view P }
  3590. Current := P; { Set as current view }
  3591. UnLock; { Redraw now }
  3592. End;
  3593. END;
  3594. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3595. { TFrame OBJECT METHODS }
  3596. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3597. {--TFrame-------------------------------------------------------------------}
  3598. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3599. {---------------------------------------------------------------------------}
  3600. CONSTRUCTOR TFrame.Init (Var Bounds: TRect);
  3601. BEGIN
  3602. Inherited Init(Bounds); { Call ancestor }
  3603. GrowMode := gfGrowHiX + gfGrowHiY; { Set grow modes }
  3604. EventMask := EventMask OR evBroadcast; { See broadcasts }
  3605. END;
  3606. {--TFrame-------------------------------------------------------------------}
  3607. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3608. {---------------------------------------------------------------------------}
  3609. FUNCTION TFrame.GetPalette: PPalette;
  3610. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILER }
  3611. CONST P: String = CFrame; { Possible huge string }
  3612. {$ELSE} { OTHER COMPILERS }
  3613. CONST P: String[Length(CFrame)] = CFrame; { Always normal string }
  3614. {$ENDIF}
  3615. BEGIN
  3616. GetPalette := @P; { Return palette }
  3617. END;
  3618. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3619. { TScrollBar OBJECT METHODS }
  3620. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3621. {---------------------------------------------------------------------------}
  3622. { TScrollBar WINDOW CLASS NAME CONSTANT }
  3623. {---------------------------------------------------------------------------}
  3624. {$IFDEF OS_WINDOWS} { WIN/NT CLASSNAME }
  3625. CONST TvScrollBarName = 'SCROLLBAR'; { Native classname }
  3626. {$ENDIF}
  3627. {$IFDEF OS_OS2} { OS2 CLASSNAME }
  3628. CONST TvScrollBarName = '#8'; { Native classname }
  3629. {$ENDIF}
  3630. {--TScrollBar---------------------------------------------------------------}
  3631. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3632. {---------------------------------------------------------------------------}
  3633. CONSTRUCTOR TScrollBar.Init (Var Bounds: TRect);
  3634. CONST VChars: TScrollChars = (#30, #31, #177, #254, #178);
  3635. HChars: TScrollChars = (#17, #16, #177, #254, #178);
  3636. BEGIN
  3637. Inherited Init(Bounds); { Call ancestor }
  3638. {$IFDEF OS_OS2} { OS2 CODE }
  3639. If (Size.X = 1) Then RawSize.X := WinQuerySysValue(
  3640. HWND_Desktop, SV_CXVScroll) Else
  3641. RawSize.Y := WinQuerySysValue(HWND_Desktop,
  3642. SV_CYHScroll); { Set approp size }
  3643. {$ENDIF}
  3644. PgStep := 1; { Page step size = 1 }
  3645. ArStep := 1; { Arrow step sizes = 1 }
  3646. If (Size.X = 1) Then Begin { Vertical scrollbar }
  3647. GrowMode := gfGrowLoX + gfGrowHiX + gfGrowHiY; { Grow vertically }
  3648. Chars := VChars; { Vertical chars }
  3649. End Else Begin { Horizontal scrollbar }
  3650. GrowMode := gfGrowLoY + gfGrowHiX + gfGrowHiY; { Grow horizontal }
  3651. Chars := HChars; { Horizontal chars }
  3652. End;
  3653. END;
  3654. {--TScrollBar---------------------------------------------------------------}
  3655. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3656. {---------------------------------------------------------------------------}
  3657. { This load method will read old original TV data from a stream with the }
  3658. { scrollbar id set to zero. }
  3659. {---------------------------------------------------------------------------}
  3660. CONSTRUCTOR TScrollBar.Load (Var S: TStream);
  3661. BEGIN
  3662. Inherited Load(S); { Call ancestor }
  3663. S.Read(Value, 2); { Read current value }
  3664. S.Read(Min , 2); { Read min value }
  3665. S.Read(Max, 2); { Read max value }
  3666. S.Read(PgStep, 2); { Read page step size }
  3667. S.Read(ArStep, 2); { Read arrow step size }
  3668. S.Read(Chars, SizeOf(Chars)); { Read scroll chars }
  3669. If (Options AND ofGFVModeView <> 0) Then { GFV mode view check }
  3670. S.Read(Id, 2); { Read id }
  3671. END;
  3672. {--TScrollBar---------------------------------------------------------------}
  3673. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3674. {---------------------------------------------------------------------------}
  3675. FUNCTION TScrollBar.GetPalette: PPalette;
  3676. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILER }
  3677. CONST P: String = CScrollBar; { Possible huge string }
  3678. {$ELSE} { OTHER COMPILERS }
  3679. CONST P: String[Length(CScrollBar)] = CScrollBar; { Always normal string }
  3680. {$ENDIF}
  3681. BEGIN
  3682. GetPalette := @P; { Return palette }
  3683. END;
  3684. {--TScrollBar---------------------------------------------------------------}
  3685. { ScrollStep -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3686. {---------------------------------------------------------------------------}
  3687. FUNCTION TScrollBar.ScrollStep (Part: Integer): Integer;
  3688. VAR Step: Integer;
  3689. BEGIN
  3690. If (Part AND $0002 = 0) Then Step := ArStep { Range step size }
  3691. Else Step := PgStep; { Page step size }
  3692. If (Part AND $0001 = 0) Then ScrollStep := -Step { Upwards move }
  3693. Else ScrollStep := Step; { Downwards move }
  3694. END;
  3695. {--TScrollBar---------------------------------------------------------------}
  3696. { Draw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  3697. {---------------------------------------------------------------------------}
  3698. PROCEDURE TScrollBar.Draw;
  3699. BEGIN
  3700. If (GOptions AND goNativeClass = 0) Then
  3701. DrawPos(GetPos); { Draw position }
  3702. END;
  3703. {--TScrollBar---------------------------------------------------------------}
  3704. { ScrollDraw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3705. {---------------------------------------------------------------------------}
  3706. PROCEDURE TScrollBar.ScrollDraw;
  3707. VAR P: PView;
  3708. BEGIN
  3709. If (Id <> 0) Then Begin
  3710. P := TopView; { Get topmost view }
  3711. NewMessage(P, evCommand, cmIdCommunicate, Id,
  3712. Value, @Self); { New Id style message }
  3713. End;
  3714. NewMessage(Owner, evBroadcast, cmScrollBarChanged,
  3715. Id, Value, @Self); { Old TV style message }
  3716. END;
  3717. {--TScrollBar---------------------------------------------------------------}
  3718. { DrawBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3719. {---------------------------------------------------------------------------}
  3720. PROCEDURE TScrollBar.DrawBackGround;
  3721. VAR Bc: Byte;
  3722. BEGIN
  3723. If (GOptions AND goNativeClass = 0) Then Begin { Non natives draw }
  3724. Inherited DrawBackGround; { Call ancestor }
  3725. Bc := GetColor(1) AND $F0 SHR 4; { Background colour }
  3726. ClearArea(0, 0, FontWidth-1, FontHeight-1, Bc); { Clear top/left area }
  3727. BiColorRectangle(0, 0, FontWidth-1, FontHeight-1,
  3728. 15, 0, False); { Draw 3d effect }
  3729. ClearArea(RawSize.X-FontWidth+1, RawSize.Y-
  3730. FontHeight+1, RawSize.X, RawSize.Y, Bc); { Clr right/lower area }
  3731. BiColorRectangle(RawSize.X-FontWidth+1,
  3732. RawSize.Y-FontHeight+1,RawSize.X, RawSize.Y,
  3733. 15, 0, False); { Draw 3d effect }
  3734. End;
  3735. END;
  3736. {--TScrollBar---------------------------------------------------------------}
  3737. { SetValue -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19May98 LdB }
  3738. {---------------------------------------------------------------------------}
  3739. PROCEDURE TScrollBar.SetValue (AValue: Integer);
  3740. BEGIN
  3741. SetParams(AValue, Min, Max, PgStep, ArStep); { Set value }
  3742. END;
  3743. {--TScrollBar---------------------------------------------------------------}
  3744. { SetRange -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19May98 LdB }
  3745. {---------------------------------------------------------------------------}
  3746. PROCEDURE TScrollBar.SetRange (AMin, AMax: Integer);
  3747. BEGIN
  3748. SetParams(Value, AMin, AMax, PgStep, ArStep); { Set range }
  3749. END;
  3750. {--TScrollBar---------------------------------------------------------------}
  3751. { SetStep -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19May98 LdB }
  3752. {---------------------------------------------------------------------------}
  3753. PROCEDURE TScrollBar.SetStep (APgStep, AArStep: Integer);
  3754. BEGIN
  3755. SetParams(Value, Min, Max, APgStep, AArStep); { Set step sizes }
  3756. END;
  3757. {--TScrollBar---------------------------------------------------------------}
  3758. { SetParams -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 21Jul99 LdB }
  3759. {---------------------------------------------------------------------------}
  3760. PROCEDURE TScrollBar.SetParams (AValue, AMin, AMax, APgStep, AArStep: Integer);
  3761. BEGIN
  3762. If (AMax < AMin) Then AMax := AMin; { Max below min fix up }
  3763. If (AValue < AMin) Then AValue := AMin; { Value below min fix }
  3764. If (AValue > AMax) Then AValue := AMax; { Value above max fix }
  3765. If (Value <> AValue) OR (Min <> AMin) OR
  3766. (Max <> AMax) Then Begin { Something changed }
  3767. If (Min <> AMin) OR (Max <> AMax) Then Begin { Range has changed }
  3768. If (GOptions AND goNativeClass = 0) Then
  3769. ClearPos(GetPos); { Clear old position }
  3770. Min := AMin; { Set new minimum }
  3771. Max := AMax; { Set new maximum }
  3772. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  3773. If (GOptions AND goNativeClass <> 0) AND { In native class mode }
  3774. (HWindow <> 0) Then
  3775. SetScrollRange(HWindow, sb_Ctl, Min, Max, { Set range }
  3776. AValue = Value); { Value=AValue redraws }
  3777. {$ENDIF}
  3778. {$IFDEF OS_OS2} { OS2 CODE }
  3779. If (GOptions AND goNativeClass <> 0) AND { In native class mode }
  3780. (HWindow <> 0) AND ((Min <> 0) OR (Max <> 0))
  3781. Then Begin { Valid window }
  3782. WinSendMsg(HWindow, sbm_SetScrollBar, Value,
  3783. (LongInt(Max-1) SHL 16) OR Min); { Post the message }
  3784. End;
  3785. {$ENDIF}
  3786. { This was removed as found not needed but if you
  3787. change limits but value unchanged scrollbar is not redrawm..LdB }
  3788. {If (Value = AValue) AND (State and sfVisible <> 0)
  3789. Then ScrollDraw;} { Send message out }
  3790. End Else Begin
  3791. If (GOptions AND goNativeClass = 0) Then { Not in native mode }
  3792. ClearPos(GetPos); { Clear old position }
  3793. End;
  3794. If (Value <> AValue) Then Begin { Position moved }
  3795. Value := AValue; { Set new value }
  3796. If (GOptions AND goNativeClass = 0) Then Begin { Not in native mode }
  3797. SetDrawMask(vdInner); { Set draw masks }
  3798. DrawView; { Redraw changed }
  3799. End;
  3800. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  3801. If (GOptions AND goNativeClass <> 0) AND { In native class mode }
  3802. (HWindow <> 0) Then { Valid handle }
  3803. SetScrollPos(HWindow, sb_Ctl, Value, True); { Set scrollbar pos }
  3804. {$ENDIF}
  3805. {$IFDEF OS_OS2} { OS2 CODE }
  3806. If (GOptions AND goNativeClass <> 0) AND { In native class mode }
  3807. (HWindow <> 0) Then Begin { Valid window }
  3808. WinSendMsg(HWindow, sbm_SetPos, Value, 0); { Dispatch the message }
  3809. End;
  3810. {$ENDIF}
  3811. If (State AND sfVisible <> 0) Then ScrollDraw; { Send update message }
  3812. End;
  3813. End;
  3814. PgStep := APgStep; { Hold page step }
  3815. ArStep := AArStep; { Hold arrow step }
  3816. END;
  3817. {--TScrollBar---------------------------------------------------------------}
  3818. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3819. {---------------------------------------------------------------------------}
  3820. { You can save data to the stream compatable with the old original TV by }
  3821. { temporarily turning off the ofGrafVersion making the call to this store }
  3822. { routine and resetting the ofGrafVersion flag after the call. }
  3823. {---------------------------------------------------------------------------}
  3824. PROCEDURE TScrollBar.Store (Var S: TStream);
  3825. BEGIN
  3826. TView.Store(S); { TView.Store called }
  3827. S.Write(Value, 2); { Write current value }
  3828. S.Write(Min, 2); { Write min value }
  3829. S.Write(Max, 2); { Write max value }
  3830. S.Write(PgStep, 2); { Write page step size }
  3831. S.Write(ArStep, 2); { Write arrow step size }
  3832. S.Write(Chars, SizeOf(Chars)); { Write scroll chars }
  3833. If (Options AND ofGFVModeView <> 0) Then { GFV mode view check }
  3834. S.Write(Id, 2); { Write scrollbar id }
  3835. END;
  3836. {--TScrollBar---------------------------------------------------------------}
  3837. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  3838. {---------------------------------------------------------------------------}
  3839. PROCEDURE TScrollBar.HandleEvent (Var Event: TEvent);
  3840. VAR Tracking: Boolean; I, P, S, ClickPart, Iv: Integer;
  3841. Mouse: TPoint; Extent: TRect;
  3842. FUNCTION GetPartCode: Integer;
  3843. VAR Mark, Part, J: Integer;
  3844. BEGIN
  3845. Part := -1; { Preset failure }
  3846. If Extent.Contains(Mouse) Then Begin { Contains mouse }
  3847. If (Size.X = 1) Then Begin { Vertical scrollbar }
  3848. Mark := Mouse.Y - FontHeight; { Calc position }
  3849. J := FontHeight; { Font height }
  3850. End Else Begin { Horizontal bar }
  3851. Mark := Mouse.X - FontWidth; { Calc position }
  3852. J := FontWidth; { Font width }
  3853. End;
  3854. If (Mark >= P) AND (Mark < P+J) Then { Within thumbnail }
  3855. Part := sbIndicator; { Indicator part }
  3856. If (Part <> sbIndicator) Then Begin { Not indicator part }
  3857. If (Mark < 1) Then Part := sbLeftArrow Else { Left arrow part }
  3858. If (Mark < P) Then Part := sbPageLeft Else { Page left part }
  3859. If (Mark < S) Then Part := sbPageRight Else { Page right part }
  3860. Part := sbRightArrow; { Right arrow part }
  3861. If (Size.X = 1) Then Inc(Part, 4); { Correct for vertical }
  3862. End;
  3863. End;
  3864. GetPartCode := Part; { Return part code }
  3865. END;
  3866. PROCEDURE Clicked;
  3867. BEGIN
  3868. NewMessage(Owner, evBroadcast, cmScrollBarClicked,
  3869. Id, Value, @Self); { Old TV style message }
  3870. END;
  3871. BEGIN
  3872. Inherited HandleEvent(Event); { Call ancestor }
  3873. Case Event.What Of
  3874. evNothing: Exit; { Speed up exit }
  3875. evCommand: Begin { Command event }
  3876. If (Event.Command = cmIdCommunicate) AND { Id communication }
  3877. (Event.Id = Id) AND (Event.InfoPtr <> @Self) { Targeted to us }
  3878. Then Begin
  3879. SetValue(Round(Event.Data)); { Set scrollbar value }
  3880. ClearEvent(Event); { Event was handled }
  3881. End;
  3882. End;
  3883. evKeyDown:
  3884. If (State AND sfVisible <> 0) Then Begin { Scrollbar visible }
  3885. ClickPart := sbIndicator; { Preset result }
  3886. If (Size.Y = 1) Then { Horizontal bar }
  3887. Case CtrlToArrow(Event.KeyCode) Of
  3888. kbLeft: ClickPart := sbLeftArrow; { Left one item }
  3889. kbRight: ClickPart := sbRightArrow; { Right one item }
  3890. kbCtrlLeft: ClickPart := sbPageLeft; { One page left }
  3891. kbCtrlRight: ClickPart := sbPageRight; { One page right }
  3892. kbHome: I := Min; { Move to start }
  3893. kbEnd: I := Max; { Move to end }
  3894. Else Exit; { Not a valid key }
  3895. End
  3896. Else { Vertical bar }
  3897. Case CtrlToArrow(Event.KeyCode) Of
  3898. kbUp: ClickPart := sbUpArrow; { One item up }
  3899. kbDown: ClickPart := sbDownArrow; { On item down }
  3900. kbPgUp: ClickPart := sbPageUp; { One page up }
  3901. kbPgDn: ClickPart := sbPageDown; { One page down }
  3902. kbCtrlPgUp: I := Min; { Move to top }
  3903. kbCtrlPgDn: I := Max; { Move to bottom }
  3904. Else Exit; { Not a valid key }
  3905. End;
  3906. Clicked; { Send out message }
  3907. If (ClickPart <> sbIndicator) Then
  3908. I := Value + ScrollStep(ClickPart); { Calculate position }
  3909. SetValue(I); { Set new item }
  3910. ClearEvent(Event); { Event now handled }
  3911. End;
  3912. evMouseDown: Begin { Mouse press event }
  3913. Clicked; { Scrollbar clicked }
  3914. Mouse.X := Event.Where.X - RawOrigin.X; { Localize x value }
  3915. Mouse.Y := Event.Where.Y - RawOrigin.Y; { Localize y value }
  3916. Extent.A.X := 0; { Zero x extent value }
  3917. Extent.A.Y := 0; { Zero y extent value }
  3918. Extent.B.X := RawSize.X; { Set extent x value }
  3919. Extent.B.Y := RawSize.Y; { set extent y value }
  3920. P := GetPos; { Current position }
  3921. S := GetSize; { Initial size }
  3922. ClickPart := GetPartCode; { Get part code }
  3923. If (ClickPart <> sbIndicator) Then Begin { Not thumb nail }
  3924. Repeat
  3925. Mouse.X := Event.Where.X-RawOrigin.X; { Localize x value }
  3926. Mouse.Y := Event.Where.Y-RawOrigin.Y; { Localize y value }
  3927. If GetPartCode = ClickPart Then
  3928. SetValue(Value+ScrollStep(ClickPart)); { Same part repeat }
  3929. Until NOT MouseEvent(Event, evMouseAuto); { Until auto done }
  3930. Clicked; { Scrollbar clicked }
  3931. End Else Begin { Thumb nail move }
  3932. Iv := Value; { Initial value }
  3933. Repeat
  3934. Mouse.X := Event.Where.X - RawOrigin.X; { Localize x value }
  3935. Mouse.Y := Event.Where.Y - RawOrigin.Y; { Localize y value }
  3936. Tracking := Extent.Contains(Mouse); { Check contains }
  3937. If Tracking Then Begin { Tracking mouse }
  3938. If (Size.X=1) Then
  3939. I := Mouse.Y-FontHeight Else { Calc vert position }
  3940. I := Mouse.X-FontWidth; { Calc horz position }
  3941. If (I < 0) Then I := 0; { Check underflow }
  3942. If (I > S) Then I := S; { Check overflow }
  3943. End Else I := GetPos; { Get position }
  3944. If (I <> P) Then Begin
  3945. SetValue(LongInt((LongInt(I)*(Max-Min))
  3946. +(S SHR 1)) DIV S + Min); { Set new value }
  3947. P := I; { Hold new position }
  3948. End;
  3949. Until NOT MouseEvent(Event, evMouseMove); { Until not moving }
  3950. If Tracking AND (S > 0) Then { Tracking mouse }
  3951. SetValue(LongInt((LongInt(P)*(Max-Min))+
  3952. (S SHR 1)) DIV S + Min); { Set new value }
  3953. If (Iv <> Value) Then Clicked; { Scroll has moved }
  3954. End;
  3955. ClearEvent(Event); { Clear the event }
  3956. End;
  3957. End;
  3958. END;
  3959. {$IFNDEF OS_DOS} { WIN/NT/OS2 CODE }
  3960. {***************************************************************************}
  3961. { TScrollBar OBJECT WIN/NT/OS2 ONLY METHODS }
  3962. {***************************************************************************}
  3963. {--TScrollBar---------------------------------------------------------------}
  3964. { GetClassName -> Platforms WIN/NT/OS2 - Updated 21May98 LdB }
  3965. {---------------------------------------------------------------------------}
  3966. FUNCTION TScrollBar.GetClassName: String;
  3967. BEGIN
  3968. If UseNativeClasses Then Begin
  3969. GetClassName := TvScrollBarName; { Windows class name }
  3970. GOptions := GOptions OR goNativeClass; { Native class window }
  3971. End Else GetClassName := Inherited GetClassName; { Use standard class }
  3972. END;
  3973. {--TScrollBar---------------------------------------------------------------}
  3974. { GetClassAttr -> Platforms WIN/NT/OS2 - Updated 20May98 LdB }
  3975. {---------------------------------------------------------------------------}
  3976. FUNCTION TScrollBar.GetClassAttr: LongInt;
  3977. VAR Li: LongInt;
  3978. BEGIN
  3979. Li := Inherited GetClassAttr; { Call ancestor }
  3980. If UseNativeClasses Then Begin
  3981. If (Size.Y = 1) Then
  3982. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  3983. Li := Li OR sbs_Horz OR sbs_TopAlign Else { Horizontal scrollbar }
  3984. Li := Li OR sbs_Vert OR sbs_LeftAlign; { Vertical scollbar }
  3985. {$ENDIF}
  3986. {$IFDEF OS_OS2} { OS2 CODE }
  3987. lStyle :=lStyle OR sbs_Horz OR sbs_AutoSize { Horizontal scrollbar }
  3988. Else lStyle := lStyle OR sbs_Vert OR
  3989. sbs_AutoSize; { Vertical scollbar }
  3990. {$ENDIF}
  3991. End;
  3992. GetClassAttr := Li; { Return attributes }
  3993. END;
  3994. {--TScrollBar---------------------------------------------------------------}
  3995. { CreateWindowNow -> Platforms WIN/NT/OS2 - Updated 22May98 LdB }
  3996. {---------------------------------------------------------------------------}
  3997. PROCEDURE TScrollBar.CreateWindowNow (CmdShow: Integer);
  3998. {$IFDEF OS_OS2} VAR Mp1, Mp2: MParam; {$ENDIF}
  3999. BEGIN
  4000. Inherited CreateWindowNow(0); { Call inherited }
  4001. If (GOptions AND goNativeClass <> 0) AND { In native class mode }
  4002. (HWindow <> 0) AND ((Min <> 0) OR (Max <> 0))
  4003. Then Begin { Scrollbar created }
  4004. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4005. SetScrollRange(HWindow, sb_Ctl, Min,Max, True); { Set scrollbar range }
  4006. SetScrollPos(HWindow, sb_Ctl, Value, True); { Set scrollbar pos }
  4007. {$ENDIF}
  4008. {$IFDEF OS_OS2} { OS2 CODE }
  4009. WinSendMsg(HWindow, sbm_SetScrollBar, Value,
  4010. (LongInt(Max-1) SHL 16) OR Min); { Post the message }
  4011. {$ENDIF}
  4012. End;
  4013. END;
  4014. {$ENDIF}
  4015. {***************************************************************************}
  4016. { TScrollBar OBJECT PRIVATE METHODS }
  4017. {***************************************************************************}
  4018. {--TScrollBar---------------------------------------------------------------}
  4019. { GetPos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23May98 LdB }
  4020. {---------------------------------------------------------------------------}
  4021. FUNCTION TScrollBar.GetPos: Integer;
  4022. VAR R: Integer;
  4023. BEGIN
  4024. R := Max - Min; { Get full range }
  4025. If (R = 0) Then GetPos := 0 Else { Return zero }
  4026. GetPos := LongInt((LongInt(Value-Min) * GetSize)
  4027. + (R SHR 1)) DIV R; { Calc position }
  4028. END;
  4029. {--TScrollBar---------------------------------------------------------------}
  4030. { GetSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23May98 LdB }
  4031. {---------------------------------------------------------------------------}
  4032. FUNCTION TScrollBar.GetSize: Integer;
  4033. VAR S: Integer;
  4034. BEGIN
  4035. If (Size.X = 1) Then S := RawSize.Y-3*FontHeight+1 { Vertical bar }
  4036. Else S := RawSize.X-3*FontWidth+1; { Horizontal bar }
  4037. If (S < 1) Then S := 1; { Fix minimum size }
  4038. GetSize := S; { Return size }
  4039. END;
  4040. {--TScrollBar---------------------------------------------------------------}
  4041. { DrawPos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27OctMay99 LdB }
  4042. {---------------------------------------------------------------------------}
  4043. { This could be called from a message handling event so it must check the }
  4044. { view is visible, exposed and not obstructed before drawing the thumbnail }
  4045. { square area. }
  4046. {---------------------------------------------------------------------------}
  4047. PROCEDURE TScrollBar.DrawPos (Pos: Integer);
  4048. VAR X1, Y1, X2, Y2: Integer; ViewPort: ViewPortType;
  4049. BEGIN
  4050. If (State AND sfVisible <> 0) AND { View is visible }
  4051. (State AND sfExposed <> 0) AND { View is exposed }
  4052. (Max <> Min) Then Begin { View has some size }
  4053. SetViewLimits; { Set view limits }
  4054. GetViewSettings(ViewPort); { Get set viewport }
  4055. If OverlapsArea(ViewPort.X1, ViewPort.Y1,
  4056. ViewPort.X2, ViewPort.Y2) Then Begin { Must be in area }
  4057. {$IFDEF OS_DOS}
  4058. HideMouseCursor; { Hide the mouse }
  4059. {$ENDIF}
  4060. X1 := 0; { Initial x position }
  4061. Y1 := 0; { Initial y position }
  4062. If (Size.X=1) Then Y1 := Pos + FontHeight { Vertical bar }
  4063. Else X1 := Pos + FontWidth; { Horizontal bar }
  4064. X2 := X1 + FontWidth - 1; { Right side point }
  4065. Y2 := Y1 + FontHeight - 1; { Lower side point }
  4066. ClearArea(X1, Y1, X2, Y2, GetColor(2) AND $0F);{ Thumbnail back }
  4067. BiColorRectangle(X1, Y1, X2, Y2, 15, 8, False);{ Draw highlight }
  4068. Y1 := (Y2 + Y1) DIV 2; { Middle of thumb }
  4069. Y2 := Y1+1; { One line down }
  4070. Inc(X1, 1); { One in off left }
  4071. Dec(X2, 1); { One in off right }
  4072. BiColorRectangle(X1, Y1, X2, Y2, 15, 8, True); { Draw line marker }
  4073. {$IFDEF OS_DOS}
  4074. ShowMouseCursor; { Show the mouse }
  4075. {$ENDIF}
  4076. End;
  4077. ReleaseViewLimits; { Release the limits }
  4078. End;
  4079. END;
  4080. {--TScrollBar---------------------------------------------------------------}
  4081. { ClearPos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  4082. {---------------------------------------------------------------------------}
  4083. { This could be called from a message handling event so it must check the }
  4084. { view is visible, exposed and not obstructed before clearing the old }
  4085. { thumbnail area. }
  4086. {---------------------------------------------------------------------------}
  4087. PROCEDURE TScrollBar.ClearPos (Pos: Integer);
  4088. VAR X, Y: Integer; ViewPort: ViewPortType;
  4089. BEGIN
  4090. If (State AND sfVisible <> 0) AND { View is visible }
  4091. (State AND sfExposed <> 0) Then Begin { View is exposed }
  4092. SetViewLimits; { Set view limits }
  4093. GetViewSettings(ViewPort); { Get set viewport }
  4094. If OverlapsArea(ViewPort.X1, ViewPort.Y1,
  4095. ViewPort.X2, ViewPort.Y2) Then Begin { Must be in area }
  4096. {$IFDEF OS_DOS}
  4097. HideMouseCursor; { Hide the mouse }
  4098. {$ENDIF}
  4099. X := 0; { Initial x position }
  4100. Y := 0; { Initial y position }
  4101. If (Size.X=1) Then Y := Pos + FontHeight { Vertical bar }
  4102. Else X := Pos + FontWidth; { Horizontal bar }
  4103. ClearArea(X, Y, X+FontWidth-1, Y+FontHeight-1,
  4104. GetColor(1) AND $F0 SHR 4); { Clear the area }
  4105. {$IFDEF OS_DOS}
  4106. ShowMouseCursor; { Show the mouse }
  4107. {$ENDIF}
  4108. End;
  4109. ReleaseViewLimits; { Release the limits }
  4110. End;
  4111. END;
  4112. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4113. { TScroller OBJECT METHODS }
  4114. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4115. {--TScroller----------------------------------------------------------------}
  4116. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4117. {---------------------------------------------------------------------------}
  4118. CONSTRUCTOR TScroller.Init (Var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar);
  4119. BEGIN
  4120. Inherited Init(Bounds); { Call ancestor }
  4121. Options := Options OR ofSelectable; { View is selectable }
  4122. EventMask := EventMask OR evBroadcast; { See broadcasts }
  4123. HScrollBar := AHScrollBar; { Hold horz scrollbar }
  4124. VScrollBar := AVScrollBar; { Hold vert scrollbar }
  4125. END;
  4126. {--TScroller----------------------------------------------------------------}
  4127. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4128. {---------------------------------------------------------------------------}
  4129. { This load method will read old original TV data from a stream as well }
  4130. { as the new graphical scroller views. }
  4131. {---------------------------------------------------------------------------}
  4132. CONSTRUCTOR TScroller.Load (Var S: TStream);
  4133. BEGIN
  4134. Inherited Load(S); { Call ancestor }
  4135. GetPeerViewPtr(S, HScrollBar); { Load horz scrollbar }
  4136. GetPeerViewPtr(S, VScrollBar); { Load vert scrollbar }
  4137. S.Read(Delta.X, 2); { Read delta x value }
  4138. S.Read(Delta.Y, 2); { Read delta y value }
  4139. S.Read(Limit.X, 2); { Read limit x value }
  4140. S.Read(Limit.Y, 2); { Read limit y value }
  4141. END;
  4142. {--TScroller----------------------------------------------------------------}
  4143. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4144. {---------------------------------------------------------------------------}
  4145. FUNCTION TScroller.GetPalette: PPalette;
  4146. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILER }
  4147. CONST P: String = CScroller; { Possible huge string }
  4148. {$ELSE} { OTHER COMPILERS }
  4149. CONST P: String[Length(CScroller)] = CScroller; { Always normal string }
  4150. {$ENDIF}
  4151. BEGIN
  4152. GetPalette := @P; { Scroller palette }
  4153. END;
  4154. {--TScroller----------------------------------------------------------------}
  4155. { ScrollTo -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4156. {---------------------------------------------------------------------------}
  4157. PROCEDURE TScroller.ScrollTo (X, Y: Integer);
  4158. BEGIN
  4159. Inc(DrawLock); { Set draw lock }
  4160. If (HScrollBar<>Nil) Then HScrollBar^.SetValue(X); { Set horz scrollbar }
  4161. If (VScrollBar<>Nil) Then VScrollBar^.SetValue(Y); { Set vert scrollbar }
  4162. Dec(DrawLock); { Release draw lock }
  4163. CheckDraw; { Check need to draw }
  4164. END;
  4165. {--TScroller----------------------------------------------------------------}
  4166. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4167. {---------------------------------------------------------------------------}
  4168. PROCEDURE TScroller.SetState (AState: Word; Enable: Boolean);
  4169. PROCEDURE ShowSBar (SBar: PScrollBar);
  4170. BEGIN
  4171. If (SBar <> Nil) Then { Scroll bar valid }
  4172. If GetState(sfActive + sfSelected) Then { Check state masks }
  4173. SBar^.Show Else SBar^.Hide; { Draw appropriately }
  4174. END;
  4175. BEGIN
  4176. Inherited SetState(AState, Enable); { Call ancestor }
  4177. If (AState AND (sfActive + sfSelected) <> 0) { Active/select change }
  4178. Then Begin
  4179. ShowSBar(HScrollBar); { Redraw horz scrollbar }
  4180. ShowSBar(VScrollBar); { Redraw vert scrollbar }
  4181. End;
  4182. END;
  4183. {--TScroller----------------------------------------------------------------}
  4184. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4185. {---------------------------------------------------------------------------}
  4186. { The scroller is saved to the stream compatable with the old TV object. }
  4187. {---------------------------------------------------------------------------}
  4188. PROCEDURE TScroller.Store (Var S: TStream);
  4189. BEGIN
  4190. TView.Store(S); { Call TView explicitly }
  4191. PutPeerViewPtr(S, HScrollBar); { Store horz bar }
  4192. PutPeerViewPtr(S, VScrollBar); { Store vert bar }
  4193. S.Write(Delta.X, 2); { Write delta x value }
  4194. S.Write(Delta.Y, 2); { Write delta y value }
  4195. S.Write(Limit.X, 2); { Write limit x value }
  4196. S.Write(Limit.Y, 2); { Write limit y value }
  4197. END;
  4198. {--TScroller----------------------------------------------------------------}
  4199. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4200. {---------------------------------------------------------------------------}
  4201. PROCEDURE TScroller.HandleEvent (Var Event: TEvent);
  4202. BEGIN
  4203. Inherited HandleEvent(Event); { Call ancestor }
  4204. If (Event.What = evBroadcast) AND
  4205. (Event.Command = cmScrollBarChanged) AND { Scroll bar change }
  4206. ((Event.InfoPtr = HScrollBar) OR { Our scrollbar? }
  4207. (Event.InfoPtr = VScrollBar)) Then ScrollDraw; { Redraw scroller }
  4208. END;
  4209. {--TScroller----------------------------------------------------------------}
  4210. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4211. {---------------------------------------------------------------------------}
  4212. PROCEDURE TScroller.ChangeBounds (Var Bounds: TRect);
  4213. BEGIN
  4214. SetBounds(Bounds); { Set new bounds }
  4215. Inc(DrawLock); { Set draw lock }
  4216. SetLimit(Limit.X, Limit.Y); { Adjust limits }
  4217. Dec(DrawLock); { Release draw lock }
  4218. DrawFlag := False; { Clear draw flag }
  4219. DrawView; { Redraw now }
  4220. END;
  4221. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4222. { TListViewer OBJECT METHODS }
  4223. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4224. CONST TvListViewerName = 'LISTBOX'; { Native name }
  4225. {--TListViewer--------------------------------------------------------------}
  4226. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  4227. {---------------------------------------------------------------------------}
  4228. CONSTRUCTOR TListViewer.Init (Var Bounds: TRect; ANumCols: Word; AHScrollBar,
  4229. AVScrollBar: PScrollBar);
  4230. VAR ArStep, PgStep: Integer;
  4231. BEGIN
  4232. Inherited Init(Bounds); { Call ancestor }
  4233. Options := Options OR (ofFirstClick+ofSelectable); { Set options }
  4234. EventMask := EventMask OR evBroadcast; { Set event mask }
  4235. NumCols := ANumCols; { Hold column number }
  4236. If (AVScrollBar <> Nil) Then Begin { Chk vert scrollbar }
  4237. If (NumCols = 1) Then Begin { Only one column }
  4238. PgStep := Size.Y -1; { Set page size }
  4239. ArStep := 1; { Set step size }
  4240. End Else Begin { Multiple columns }
  4241. PgStep := Size.Y * NumCols; { Set page size }
  4242. ArStep := Size.Y; { Set step size }
  4243. End;
  4244. AVScrollBar^.SetStep(PgStep, ArStep); { Set scroll values }
  4245. End;
  4246. If (AHScrollBar <> Nil) Then
  4247. AHScrollBar^.SetStep(Size.X DIV NumCols, 1); { Set step size }
  4248. HScrollBar := AHScrollBar; { Horz scrollbar held }
  4249. VScrollBar := AVScrollBar; { Vert scrollbar held }
  4250. GOptions := GOptions OR goDrawFocus; { Draw focus changes }
  4251. END;
  4252. {--TListViewer--------------------------------------------------------------}
  4253. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  4254. {---------------------------------------------------------------------------}
  4255. CONSTRUCTOR TListViewer.Load (Var S: TStream);
  4256. BEGIN
  4257. Inherited Load(S); { Call ancestor }
  4258. GetPeerViewPtr(S, HScrollBar); { Get horz scrollbar }
  4259. GetPeerViewPtr(S, VScrollBar); { Get vert scrollbar }
  4260. S.Read(NumCols, 2); { Read column number }
  4261. S.Read(TopItem, 2); { Read top most item }
  4262. S.Read(Focused, 2); { Read focused item }
  4263. S.Read(Range, 2); { Read listview range }
  4264. END;
  4265. {--TListViewer--------------------------------------------------------------}
  4266. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  4267. {---------------------------------------------------------------------------}
  4268. FUNCTION TListViewer.GetPalette: PPalette;
  4269. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILER }
  4270. CONST P: String = CListViewer; { Possible huge string }
  4271. {$ELSE} { OTHER COMPILERS }
  4272. CONST P: String[Length(CListViewer)] = CListViewer; { Always normal string }
  4273. {$ENDIF}
  4274. BEGIN
  4275. GetPalette := @P; { Return palette }
  4276. END;
  4277. {--TListViewer--------------------------------------------------------------}
  4278. { IsSelected -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  4279. {---------------------------------------------------------------------------}
  4280. FUNCTION TListViewer.IsSelected (Item: Integer): Boolean;
  4281. BEGIN
  4282. If (Item = Focused) Then IsSelected := True Else
  4283. IsSelected := False; { Selected item }
  4284. END;
  4285. {--TListViewer--------------------------------------------------------------}
  4286. { GetText -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  4287. {---------------------------------------------------------------------------}
  4288. FUNCTION TListViewer.GetText (Item: Integer; MaxLen: Integer): String;
  4289. BEGIN { Abstract method }
  4290. END;
  4291. {--TListViewer--------------------------------------------------------------}
  4292. { DrawBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  4293. {---------------------------------------------------------------------------}
  4294. PROCEDURE TListViewer.DrawBackGround;
  4295. VAR SCOff: Byte; I, J, ColWidth, Item, Indent, CurCol: Integer; Color: Word;
  4296. Text: String; B: TDrawBuffer;
  4297. {$IFDEF OS_WINDOWS} S: String; {$ENDIF} { WIN/NT CODE }
  4298. BEGIN
  4299. ColWidth := Size.X DIV NumCols + 1; { Calc column width }
  4300. If (HScrollBar = Nil) Then Indent := 0 Else { Set indent to zero }
  4301. Indent := HScrollBar^.Value; { Fetch any indent }
  4302. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4303. If (GOptions AND goNativeClass <> 0) Then Begin { Native class mode }
  4304. If (Range <> SendMessage(HWindow, lb_GetCount,
  4305. 0, 0)) Then SendMessage(HWindow,lb_ResetContent, { If ranges differ }
  4306. 0, 0); { Clear all strings }
  4307. For I := 1 To Range Do Begin { For each item }
  4308. J := SendMessage(HWindow, lb_GetText, 0,
  4309. LongInt(@S[1])); { Get current text }
  4310. If (J <> lb_Err) Then Begin { Check for error }
  4311. {$IFDEF PPC_DELPHI3} { DELPHI 3+ COMPILER }
  4312. SetLength(S, J); { Set string length }
  4313. {$ELSE} { OTHER COMPILERS }
  4314. S[0] := Chr(J); { Set string legth }
  4315. {$ENDIF}
  4316. End Else S := ''; { Error no string }
  4317. Text := GetText(I-1, ColWidth + Indent); { Fetch text }
  4318. Text := Copy(Text, Indent, ColWidth) + #0; { Select right bit }
  4319. If (S <> Text) Then Begin { Strings differ }
  4320. If (J <> lb_Err) Then SendMessage(HWindow,
  4321. lb_DeleteString, I-1, 0); { Delete current string }
  4322. SendMessage(HWindow, lb_InsertString, I-1,
  4323. LongInt(@Text[1])); { Set string in list }
  4324. End;
  4325. End;
  4326. If (Options AND ofSelectable <> 0) Then
  4327. SendMessage(HWindow, lb_SetCurSel, Focused, 0); { Focus selected item }
  4328. TopItem := SendMessage(HWindow, lb_GetTopIndex,
  4329. 0, 0); { Synchronize }
  4330. UpdateWindow(HWindow); { Redraw new strings }
  4331. Exit; { Native mode is done }
  4332. End;
  4333. {$ENDIF}
  4334. Inherited DrawBackGround; { Call ancestor }
  4335. Color := GetColor(2); { Normal colour }
  4336. For I := 0 To Size.Y - 1 Do Begin { For each line }
  4337. For J := 0 To NumCols-1 Do Begin { For each column }
  4338. Item := J*Size.Y + I + TopItem; { Process this item }
  4339. CurCol := J*ColWidth; { Current column }
  4340. MoveChar(B[CurCol], ' ', Color, ColWidth); { Clear buffer }
  4341. If (Item < Range) Then Begin { Within text range }
  4342. Text := GetText(Item, ColWidth + Indent); { Fetch text }
  4343. Text := Copy(Text, Indent, ColWidth); { Select right bit }
  4344. MoveStr(B[CurCol+1], Text, Color); { Transfer to buffer }
  4345. If ShowMarkers Then Begin
  4346. WordRec(B[CurCol]).Lo := Byte(
  4347. SpecialChars[SCOff]); { Set marker character }
  4348. WordRec(B[CurCol+ColWidth-2]).Lo := Byte(
  4349. SpecialChars[SCOff+1]); { Set marker character }
  4350. End;
  4351. End;
  4352. MoveChar(B[CurCol+ColWidth-1], #179,
  4353. GetColor(5), 1); { Put centre line marker }
  4354. End;
  4355. WriteLine(0, I, Size.X, 1, B); { Write line to screen }
  4356. End;
  4357. END;
  4358. {--TListViewer--------------------------------------------------------------}
  4359. { DrawFocus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  4360. {---------------------------------------------------------------------------}
  4361. PROCEDURE TListViewer.DrawFocus;
  4362. VAR DrawIt: Boolean; I, J, Item, CurCol, ColWidth: Integer;
  4363. Color: Word;
  4364. Indent: Integer;
  4365. B: TDrawBuffer;
  4366. Text,S: String;
  4367. SCOff: Byte;
  4368. BEGIN
  4369. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4370. If (GOptions AND goNativeClass <> 0) Then Exit; { Native class exits }
  4371. {$ENDIF}
  4372. ColWidth := Size.X DIV NumCols + 1; { Calc column width }
  4373. If (HScrollBar = Nil) Then Indent := 0 Else { Set indent to zero }
  4374. Indent := HScrollBar^.Value; { Fetch any indent }
  4375. For I := 0 To Size.Y - 1 Do Begin { For each line }
  4376. For J := 0 To NumCols-1 Do Begin { For each column }
  4377. Item := J*Size.Y + I + TopItem; { Process this item }
  4378. CurCol := J*ColWidth; { Current column }
  4379. DrawIt := False; { Preset false }
  4380. If (State AND (sfSelected + sfActive) =
  4381. (sfSelected + sfActive)) AND (Focused = Item) { Focused item }
  4382. AND (Range > 0) Then Begin
  4383. DrawIt := True; { Draw this item }
  4384. Color := GetColor(3); { Focused colour }
  4385. SetCursor(CurCol+1,I); { Set the cursor }
  4386. SCOff := 0; { Zero colour offset }
  4387. End Else If (Item < Range) AND IsSelected(Item){ Selected item }
  4388. Then Begin
  4389. DrawIt := True; { Draw this item }
  4390. If (State AND sfActive <> 0) Then
  4391. Color := GetColor(4) Else { Selected colour }
  4392. Color := GetColor(2); { Remove focus }
  4393. SCOff := 2; { Colour offset=2 }
  4394. End;
  4395. If DrawIt Then Begin { We are drawing item }
  4396. ClearArea(0, I*FontHeight, ColWidth*FontWidth,
  4397. (I+1)*FontHeight-1, Color AND $F0 SHR 4); { Draw the bar }
  4398. MoveChar(B[CurCol], ' ', Color, ColWidth);
  4399. if Item < Range then begin
  4400. Text := GetText(Item, ColWidth + Indent);
  4401. Text := Copy(Text,Indent,ColWidth);
  4402. MoveStr(B[CurCol+1], Text, Color);
  4403. if ShowMarkers then begin
  4404. WordRec(B[CurCol]).Lo := Byte(SpecialChars[SCOff]);
  4405. WordRec(B[CurCol+ColWidth-2]).Lo := Byte(SpecialChars[SCOff+1]);
  4406. end;
  4407. end;
  4408. MoveChar(B[CurCol+ColWidth-1], #179, GetColor(5), 1);
  4409. WriteLine(0, I, Size.X, 1, B);
  4410. End;
  4411. End;
  4412. End;
  4413. END;
  4414. {--TListViewer--------------------------------------------------------------}
  4415. { FocusItem -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4416. {---------------------------------------------------------------------------}
  4417. PROCEDURE TListViewer.FocusItem (Item: Integer);
  4418. BEGIN
  4419. Focused := Item; { Set focus to item }
  4420. If (VScrollBar <> Nil) Then
  4421. VScrollBar^.SetValue(Item); { Scrollbar to value }
  4422. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4423. If (GOptions AND goNativeClass <> 0) Then Begin { Native class mode }
  4424. If (HWindow <> 0) Then Begin { Check window valid }
  4425. If (Options AND ofSelectable <> 0) Then
  4426. SendMessage(HWindow, lb_SetCurSel, Focused, 0);{ Focus selected item }
  4427. TopItem := SendMessage(HWindow, lb_GetTopIndex,
  4428. 0, 0); { Synchronize }
  4429. End;
  4430. Exit; { Native mode done }
  4431. End;
  4432. {$ENDIF}
  4433. If (Item < TopItem) Then { Item above top item }
  4434. If (NumCols = 1) Then TopItem := Item { Set top item }
  4435. Else TopItem := Item - Item MOD Size.Y { Set top item }
  4436. Else If (Item >= TopItem + (Size.Y*NumCols)) Then { Item below bottom }
  4437. If (NumCols = 1) Then TopItem := Item-Size.Y+1 { Set new top item }
  4438. Else TopItem := Item - Item MOD Size.Y -
  4439. (Size.Y*(NumCols-1)); { Set new top item }
  4440. END;
  4441. {--TListViewer--------------------------------------------------------------}
  4442. { SetTopItem -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06Aug99 LdB }
  4443. {---------------------------------------------------------------------------}
  4444. PROCEDURE TListViewer.SetTopItem (Item: Integer);
  4445. BEGIN
  4446. TopItem := Item; { Set the top item }
  4447. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4448. If (GOptions AND goNativeClass <> 0) AND { Native class mode }
  4449. (HWindow <> 0) Then { Window valid }
  4450. SendMessage(HWindow, lb_SetTopIndex, Item, 0); { Synchronize }
  4451. {$ENDIF}
  4452. END;
  4453. {--TListViewer--------------------------------------------------------------}
  4454. { SetRange -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4455. {---------------------------------------------------------------------------}
  4456. PROCEDURE TListViewer.SetRange (ARange: Integer);
  4457. BEGIN
  4458. Range := ARange; { Set new range }
  4459. If (VScrollBar <> Nil) Then Begin { Vertical scrollbar }
  4460. If (Focused > ARange) Then Focused := 0; { Clear focused }
  4461. VScrollBar^.SetParams(Focused, 0, ARange - 1,
  4462. VScrollBar^.PgStep, VScrollBar^.ArStep); { Set parameters }
  4463. End;
  4464. END;
  4465. {--TListViewer--------------------------------------------------------------}
  4466. { SelectItem -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4467. {---------------------------------------------------------------------------}
  4468. PROCEDURE TListViewer.SelectItem (Item: Integer);
  4469. BEGIN
  4470. Message(Owner, evBroadcast, cmListItemSelected,
  4471. @Self); { Send message }
  4472. END;
  4473. {--TListViewer--------------------------------------------------------------}
  4474. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  4475. {---------------------------------------------------------------------------}
  4476. PROCEDURE TListViewer.SetState (AState: Word; Enable: Boolean);
  4477. PROCEDURE ShowSBar(SBar: PScrollBar);
  4478. BEGIN
  4479. If (SBar <> Nil) Then { Valid scrollbar }
  4480. If GetState(sfActive) AND GetState(sfVisible) { Check states }
  4481. Then SBar^.Show Else SBar^.Hide; { Show or hide }
  4482. END;
  4483. PROCEDURE LoseFocus;
  4484. VAR Cs: Integer;
  4485. BEGIN
  4486. If (GOptions AND goNativeClass = 0) Then Begin { Not in native mode }
  4487. Cs := State; { Hold current state }
  4488. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  4489. State := State AND (sfActive XOR $FFFF); { Weird bug!!! }
  4490. {$ELSE} { OTHER COMPILERS }
  4491. State := State AND NOT sfActive; { Must remove focus }
  4492. {$ENDIF}
  4493. SetDrawmask(vdFocus); { Set focus mask }
  4494. DrawView; { Remove focus box }
  4495. State := Cs; { Reset state masks }
  4496. End;
  4497. END;
  4498. BEGIN
  4499. Inherited SetState(AState, Enable); { Call ancestor }
  4500. If (AState AND sfFocused <> 0) Then { Focus change }
  4501. If NOT Enable Then LoseFocus; { Redraw drop focus }
  4502. If (AState AND (sfSelected + sfActive + sfVisible) <> 0)
  4503. Then Begin { Check states }
  4504. SetDrawMask(vdFocus);
  4505. DrawView; { Draw the view }
  4506. ShowSBar(HScrollBar); { Show horz scrollbar }
  4507. ShowSBar(VScrollBar); { Show vert scrollbar }
  4508. End;
  4509. END;
  4510. {--TListViewer--------------------------------------------------------------}
  4511. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4512. {---------------------------------------------------------------------------}
  4513. PROCEDURE TListViewer.Store (Var S: TStream);
  4514. BEGIN
  4515. TView.Store(S); { Call TView explicitly }
  4516. PutPeerViewPtr(S, HScrollBar); { Put horz scrollbar }
  4517. PutPeerViewPtr(S, VScrollBar); { Put vert scrollbar }
  4518. S.Write(NumCols, 2); { Write column number }
  4519. S.Write(TopItem, 2); { Write top most item }
  4520. S.Write(Focused, 2); { Write focused item }
  4521. S.Write(Range, 2); { Write listview range }
  4522. END;
  4523. {--TListViewer--------------------------------------------------------------}
  4524. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  4525. {---------------------------------------------------------------------------}
  4526. PROCEDURE TListViewer.HandleEvent (Var Event: TEvent);
  4527. CONST MouseAutosToSkip = 4;
  4528. VAR Oi, Ni: Integer; Ct, Cw: Word; Mouse: TPoint;
  4529. PROCEDURE MoveFocus (Req: Integer);
  4530. VAR Ti, Cs: Integer;
  4531. BEGIN
  4532. If (GOptions AND goNativeClass = 0) Then Begin { Not in native mode }
  4533. Ti := TopItem; { Hold top item }
  4534. Cs := State; { Hold current state }
  4535. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  4536. State := State AND (sfActive XOR $FFFF); { Weird bug!!!! }
  4537. {$ELSE} { OTHER COMPILERS }
  4538. State := State AND NOT sfActive; { Must remove focus }
  4539. {$ENDIF}
  4540. SetDrawmask(vdFocus); { Set focus mask }
  4541. DrawView; { Remove focus box }
  4542. State := Cs; { Reset state masks }
  4543. End;
  4544. FocusItemNum(Req); { Focus req item }
  4545. If (GOptions AND goNativeClass = 0) Then Begin { Not in native mode }
  4546. If (Ti <> TopItem) Then DrawView Else Begin { Redraw all view }
  4547. SetDrawmask(vdFocus); { Set focus mask }
  4548. DrawView; { Redraw focus box }
  4549. End;
  4550. End;
  4551. END;
  4552. BEGIN
  4553. Inherited HandleEvent(Event); { Call ancestor }
  4554. Case Event.What Of
  4555. evNothing: Exit; { Speed up exit }
  4556. evKeyDown: Begin { Key down event }
  4557. If (Event.CharCode = ' ') AND (Focused < Range){ Spacebar select }
  4558. Then Begin
  4559. SelectItem(Focused); { Select focused item }
  4560. Ni := Focused; { Hold new item }
  4561. End Else Case CtrlToArrow(Event.KeyCode) Of
  4562. kbUp: Ni := Focused - 1; { One item up }
  4563. kbDown: Ni := Focused + 1; { One item down }
  4564. kbRight: If (NumCols > 1) Then
  4565. Ni := Focused + Size.Y Else Exit; { One column right }
  4566. kbLeft: If (NumCols > 1) Then
  4567. Ni := Focused - Size.Y Else Exit; { One column left }
  4568. kbPgDn: Ni := Focused + Size.Y * NumCols; { One page down }
  4569. kbPgUp: Ni := Focused - Size.Y * NumCols; { One page up }
  4570. kbHome: Ni := TopItem; { Move to top }
  4571. kbEnd: Ni := TopItem + (Size.Y*NumCols)-1; { Move to bottom }
  4572. kbCtrlPgDn: Ni := Range - 1; { Move to last item }
  4573. kbCtrlPgUp: Ni := 0; { Move to first item }
  4574. Else Exit;
  4575. End;
  4576. MoveFocus(Ni); { Move the focus }
  4577. ClearEvent(Event); { Event was handled }
  4578. End;
  4579. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4580. evCommand: If (Event.Command = cmNotify) Then { Notify command }
  4581. Begin
  4582. FocusItem(Round(Event.Data)); { Focus the item }
  4583. SelectItem(Focused); { Select the item }
  4584. ClearEvent(Event); { Event was handled }
  4585. End Else Exit; { Not handled command }
  4586. {$ENDIF}
  4587. evBroadcast: Begin { Broadcast event }
  4588. If (Options AND ofSelectable <> 0) Then { View is selectable }
  4589. If (Event.Command = cmScrollBarClicked) AND { Scrollbar click }
  4590. ((Event.InfoPtr = HScrollBar) OR
  4591. (Event.InfoPtr = VScrollBar)) Then Select { Scrollbar selects us }
  4592. Else If (Event.Command = cmScrollBarChanged) { Scrollbar changed }
  4593. Then Begin
  4594. If (VScrollBar = Event.InfoPtr) Then Begin
  4595. MoveFocus(VScrollBar^.Value); { Focus us to item }
  4596. End Else If (HScrollBar = Event.InfoPtr)
  4597. Then DrawView; { Redraw the view }
  4598. End;
  4599. End;
  4600. evMouseDown: Begin { Mouse down event }
  4601. Cw := Size.X DIV NumCols + 1; { Column width }
  4602. Oi := Focused; { Hold focused item }
  4603. MakeLocal(Event.Where, Mouse); { Localize mouse }
  4604. If MouseInView(Event.Where) Then Ni := Mouse.Y
  4605. + (Size.Y*(Mouse.X DIV Cw))+TopItem { Calc item to focus }
  4606. Else Ni := Oi; { Focus old item }
  4607. Ct := 0; { Clear count value }
  4608. Repeat
  4609. If (Ni <> Oi) Then Begin { Item is different }
  4610. MoveFocus(Ni); { Move the focus }
  4611. Oi := Focused; { Hold as focused item }
  4612. End;
  4613. MakeLocal(Event.Where, Mouse); { Localize mouse }
  4614. If NOT MouseInView(Event.Where) Then Begin
  4615. If (Event.What = evMouseAuto) Then Inc(Ct);{ Inc auto count }
  4616. If (Ct = MouseAutosToSkip) Then Begin
  4617. Ct := 0; { Reset count }
  4618. If (NumCols = 1) Then Begin { Only one column }
  4619. If (Mouse.Y < 0) Then Ni := Focused-1; { Move up one item }
  4620. If (Mouse.Y >= Size.Y) Then
  4621. Ni := Focused+1; { Move down one item }
  4622. End Else Begin { Multiple columns }
  4623. If (Mouse.X < 0) Then { Mouse x below zero }
  4624. Ni := Focused-Size.Y; { Move down 1 column }
  4625. If (Mouse.X >= Size.X) Then { Mouse x above width }
  4626. Ni := Focused+Size.Y; { Move up 1 column }
  4627. If (Mouse.Y < 0) Then { Mouse y below zero }
  4628. Ni := Focused-Focused MOD Size.Y; { Move up one item }
  4629. If (Mouse.Y > Size.Y) Then { Mouse y above height }
  4630. Ni := Focused-Focused MOD
  4631. Size.Y+Size.Y-1; { Move down one item }
  4632. End;
  4633. End;
  4634. End Else Ni := Mouse.Y + (Size.Y*(Mouse.X
  4635. DIV Cw))+TopItem; { New item to focus }
  4636. Until NOT MouseEvent(Event, evMouseMove +
  4637. evMouseAuto); { Mouse stopped }
  4638. If (Oi <> Ni) Then MoveFocus(Ni); { Focus moved again }
  4639. If (Event.Double AND (Range > Focused)) Then
  4640. SelectItem(Focused); { Select the item }
  4641. ClearEvent(Event); { Event was handled }
  4642. End;
  4643. End;
  4644. END;
  4645. {--TListViewer--------------------------------------------------------------}
  4646. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4647. {---------------------------------------------------------------------------}
  4648. PROCEDURE TListViewer.ChangeBounds (Var Bounds: TRect);
  4649. BEGIN
  4650. Inherited ChangeBounds(Bounds); { Call ancestor }
  4651. If (HScrollBar <> Nil) Then { Valid horz scrollbar }
  4652. HScrollBar^.SetStep(Size.X DIV NumCols,
  4653. HScrollBar^.ArStep); { Update horz bar }
  4654. If (VScrollBar <> Nil) Then { Valid vert scrollbar }
  4655. VScrollBar^.SetStep(Size.Y * NumCols,
  4656. VScrollBar^.ArStep); { Update vert bar }
  4657. END;
  4658. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4659. {***************************************************************************}
  4660. { TListViewer OBJECT WIN/NT ONLY METHODS }
  4661. {***************************************************************************}
  4662. {--TListViewer--------------------------------------------------------------}
  4663. { GetNotifyCmd -> Platforms WIN/NT/OS2 - Updated 06Aug99 LdB }
  4664. {---------------------------------------------------------------------------}
  4665. FUNCTION TListViewer.GetNotifyCmd: LongInt;
  4666. BEGIN
  4667. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  4668. GetNotifyCmd := lb_GetCurSel; { Listbox get selection }
  4669. {$ENDIF}
  4670. {$IFDEF OS_OS2} { OS2 CODE }
  4671. GetNotifyCmd := lm_QuerySelection; { Listbox get selection }
  4672. {$ENDIF}
  4673. END;
  4674. {--TListViewer--------------------------------------------------------------}
  4675. { GetClassName -> Platforms WIN/NT - Updated 27Oct99 LdB }
  4676. {---------------------------------------------------------------------------}
  4677. FUNCTION TListViewer.GetClassName: String;
  4678. BEGIN
  4679. If UseNativeClasses Then Begin { Use native classes }
  4680. GetClassName := TvListViewerName; { Windows class name }
  4681. GOptions := GOptions OR goNativeClass; { Native class window }
  4682. End Else GetClassName := Inherited GetClassName; { Use standard class }
  4683. END;
  4684. {--TListViewer--------------------------------------------------------------}
  4685. { GetClassAttr -> Platforms WIN/NT - Updated 27Oct99 LdB }
  4686. {---------------------------------------------------------------------------}
  4687. FUNCTION TListViewer.GetClassAttr: LongInt;
  4688. VAR Li: LongInt;
  4689. BEGIN
  4690. Li := Inherited GetClassAttr; { Call ancestor }
  4691. Li := Li OR lbs_HasStrings OR lbs_Notify; { Set has strings mask }
  4692. If (NumCols > 1) Then
  4693. Li := Li OR lbs_MultiColumn; { Has multiple columns }
  4694. Li := Li OR LBS_NOINTEGRALHEIGHT ;
  4695. GetClassAttr := Li; { Return attributes }
  4696. END;
  4697. {--TListViewer--------------------------------------------------------------}
  4698. { CreateWindowNow -> Platforms WIN/NT - Updated 27Oct99 LdB }
  4699. {---------------------------------------------------------------------------}
  4700. PROCEDURE TListViewer.CreateWindowNow (CmdShow: Integer);
  4701. BEGIN
  4702. Inherited CreateWindowNow(CmdShow); { Call ancestor }
  4703. DrawView; { Redraw the view }
  4704. END;
  4705. {$ENDIF}
  4706. {***************************************************************************}
  4707. { TListViewer OBJECT PRIVATE METHODS }
  4708. {***************************************************************************}
  4709. {--TListViewer--------------------------------------------------------------}
  4710. { FocusItemNum -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  4711. {---------------------------------------------------------------------------}
  4712. PROCEDURE TListViewer.FocusItemNum (Item: Integer);
  4713. BEGIN
  4714. If (Item < 0) Then Item := 0 Else { Restrain underflow }
  4715. If (Item >= Range) AND (Range > 0) Then
  4716. Item := Range-1; { Restrain overflow }
  4717. If (Range <> 0) Then FocusItem(Item); { Set focus value }
  4718. END;
  4719. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4720. { TWindow OBJECT METHODS }
  4721. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4722. {--TWindow------------------------------------------------------------------}
  4723. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4724. {---------------------------------------------------------------------------}
  4725. CONSTRUCTOR TWindow.Init (Var Bounds: TRect; ATitle: TTitleStr; ANumber: Integer);
  4726. BEGIN
  4727. Inherited Init(Bounds); { Call ancestor }
  4728. State := State OR sfShadow; { View is shadowed }
  4729. Options := Options OR (ofSelectable+ofTopSelect); { Select options set }
  4730. GrowMode := gfGrowAll + gfGrowRel; { Set growmodes }
  4731. Flags := wfMove + wfGrow + wfClose + wfZoom; { Set flags }
  4732. Title := NewStr(ATitle); { Hold title }
  4733. Number := ANumber; { Hold number }
  4734. Palette := wpBlueWindow; { Default palette }
  4735. GOptions := GOptions OR goThickFramed; { Thick frame }
  4736. GOptions := GOptions OR goTitled; { Title window }
  4737. GOptions := GOptions AND NOT goNoDrawView; { View does draw self }
  4738. InitFrame; { Initialize frame }
  4739. If (Frame <> Nil) Then Insert(Frame); { Insert any frame }
  4740. GetBounds(ZoomRect); { Default zoom rect }
  4741. END;
  4742. {--TWindow------------------------------------------------------------------}
  4743. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  4744. {---------------------------------------------------------------------------}
  4745. { This load method will read old original TV data from a stream however }
  4746. { although a frame view is read for compatability it is disposed of. }
  4747. {---------------------------------------------------------------------------}
  4748. CONSTRUCTOR TWindow.Load (Var S: TStream);
  4749. BEGIN
  4750. Inherited Load(S); { Call ancestor }
  4751. S.Read(Flags, 1); { Read window flags }
  4752. S.Read(Number, 2); { Read window number }
  4753. S.Read(Palette, 2); { Read window palette }
  4754. S.Read(ZoomRect.A.X, 2); { Read zoom area x1 }
  4755. S.Read(ZoomRect.A.Y, 2); { Read zoom area y1 }
  4756. S.Read(ZoomRect.B.X, 2); { Read zoom area x2 }
  4757. S.Read(ZoomRect.B.Y, 2); { Read zoom area y2 }
  4758. GetSubViewPtr(S, Frame); { Now read frame object }
  4759. If (Frame <> Nil) Then Begin
  4760. Dispose(Frame, Done); { Kill we don't use it }
  4761. Frame := Nil; { Clear the pointer }
  4762. End;
  4763. Title := S.ReadStr; { Read title }
  4764. END;
  4765. {--TWindow------------------------------------------------------------------}
  4766. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  4767. {---------------------------------------------------------------------------}
  4768. DESTRUCTOR TWindow.Done;
  4769. BEGIN
  4770. Inherited Done; { Call ancestor }
  4771. If (Title <> Nil) Then DisposeStr(Title); { Dispose title }
  4772. END;
  4773. {--TWindow------------------------------------------------------------------}
  4774. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  4775. {---------------------------------------------------------------------------}
  4776. FUNCTION TWindow.GetPalette: PPalette;
  4777. {$IFDEF PPC_DELPHI3} { DELPHI3+ COMPILER }
  4778. CONST P: ARRAY [wpBlueWindow..wpGrayWindow] Of String =
  4779. (CBlueWindow, CCyanWindow, CGrayWindow); { Possible huge string }
  4780. {$ELSE} { OTHER COMPILERS }
  4781. CONST P: ARRAY [wpBlueWindow..wpGrayWindow] Of String[Length(CBlueWindow)] =
  4782. (CBlueWindow, CCyanWindow, CGrayWindow); { Always normal string }
  4783. {$ENDIF}
  4784. BEGIN
  4785. GetPalette := @P[Palette]; { Return palette }
  4786. END;
  4787. {--TWindow------------------------------------------------------------------}
  4788. { GetTitle -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  4789. {---------------------------------------------------------------------------}
  4790. FUNCTION TWindow.GetTitle (MaxSize: Integer): TTitleStr;
  4791. VAR S: String;
  4792. BEGIN
  4793. If (Number <> 0) Then begin { Valid window number }
  4794. Str(Number, S); { Window number }
  4795. S := '(' + S + ') '; { Insert in brackets }
  4796. End Else S := ''; { Empty string }
  4797. If (Title <> Nil) Then GetTitle := S + Title^
  4798. Else GetTitle := S; { Return title }
  4799. END;
  4800. {--TWindow------------------------------------------------------------------}
  4801. { StandardScrollBar -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  4802. {---------------------------------------------------------------------------}
  4803. FUNCTION TWindow.StandardScrollBar (AOptions: Word): PScrollBar;
  4804. VAR R: TRect; S: PScrollBar;
  4805. BEGIN
  4806. GetExtent(R); { View extents }
  4807. If (AOptions AND sbVertical = 0) Then
  4808. R.Assign(R.A.X+2, R.B.Y-1, R.B.X-2, R.B.Y) { Horizontal scrollbar }
  4809. Else R.Assign(R.B.X-1, R.A.Y+1, R.B.X, R.B.Y-1); { Vertical scrollbar }
  4810. S := New(PScrollBar, Init(R)); { Create scrollbar }
  4811. Insert(S); { Insert scrollbar }
  4812. If (AOptions AND sbHandleKeyboard <> 0) Then
  4813. S^.Options := S^.Options or ofPostProcess; { Post process }
  4814. StandardScrollBar := S; { Return scrollbar }
  4815. END;
  4816. {--TWindow------------------------------------------------------------------}
  4817. { Zoom -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep97 LdB }
  4818. {---------------------------------------------------------------------------}
  4819. PROCEDURE TWindow.Zoom;
  4820. VAR R: TRect; Max, Min: TPoint;
  4821. BEGIN
  4822. SizeLimits(Min, Max); { Return size limits }
  4823. If ((Size.X <> Max.X) OR (Size.Y <> Max.Y)) { Larger size possible }
  4824. Then Begin
  4825. GetBounds(ZoomRect); { Get zoom bounds }
  4826. R.A.X := 0; { Zero x origin }
  4827. R.A.Y := 0; { Zero y origin }
  4828. R.B := Max; { Bounds to max size }
  4829. Locate(R); { Locate the view }
  4830. End Else Locate(ZoomRect); { Move to zoom rect }
  4831. END;
  4832. {--TWindow------------------------------------------------------------------}
  4833. { Close -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep97 LdB }
  4834. {---------------------------------------------------------------------------}
  4835. PROCEDURE TWindow.Close;
  4836. BEGIN
  4837. If Valid(cmClose) Then Free; { Dispose of self }
  4838. END;
  4839. {--TWindow------------------------------------------------------------------}
  4840. { InitFrame -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  4841. {---------------------------------------------------------------------------}
  4842. PROCEDURE TWindow.InitFrame;
  4843. BEGIN { Compatability only }
  4844. END;
  4845. {--TWindow------------------------------------------------------------------}
  4846. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Mar98 LdB }
  4847. {---------------------------------------------------------------------------}
  4848. PROCEDURE TWindow.SetState (AState: Word; Enable: Boolean);
  4849. VAR WindowCommands: TCommandSet;
  4850. BEGIN
  4851. Inherited SetState(AState, Enable); { Call ancestor }
  4852. If (AState = sfSelected) Then
  4853. SetState(sfActive, Enable); { Set active state }
  4854. If (AState = sfSelected) OR ((AState = sfExposed)
  4855. AND (State AND sfSelected <> 0)) Then Begin { View is selected }
  4856. WindowCommands := [cmNext, cmPrev]; { Set window commands }
  4857. If (Flags AND (wfGrow + wfMove) <> 0) Then
  4858. WindowCommands := WindowCommands + [cmResize]; { Add resize command }
  4859. If (Flags AND wfClose <> 0) Then
  4860. WindowCommands := WindowCommands + [cmClose]; { Add close command }
  4861. If (Flags AND wfZoom <> 0) Then
  4862. WindowCommands := WindowCommands + [cmZoom]; { Add zoom command }
  4863. If Enable Then EnableCommands(WindowCommands) { Enable commands }
  4864. Else DisableCommands(WindowCommands); { Disable commands }
  4865. End;
  4866. END;
  4867. {--TWindow------------------------------------------------------------------}
  4868. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Mar98 LdB }
  4869. {---------------------------------------------------------------------------}
  4870. { You can save data to the stream compatable with the old original TV by }
  4871. { temporarily turning off the ofGrafVersion making the call to this store }
  4872. { routine and resetting the ofGrafVersion flag after the call. }
  4873. {---------------------------------------------------------------------------}
  4874. PROCEDURE TWindow.Store (Var S: TStream);
  4875. BEGIN
  4876. TGroup.Store(S); { Call group store }
  4877. S.Write(Flags, 1); { Write window flags }
  4878. S.Write(Number, 2); { Write window number }
  4879. S.Write(Palette, 2); { Write window palette }
  4880. S.Write(ZoomRect.A.X, 2); { Write zoom area x1 }
  4881. S.Write(ZoomRect.A.Y, 2); { Write zoom area y1 }
  4882. S.Write(ZoomRect.B.X, 2); { Write zoom area x2 }
  4883. S.Write(ZoomRect.B.Y, 2); { Write zoom area y2 }
  4884. PutSubViewPtr(S, Frame); { Write any frame }
  4885. S.WriteStr(Title); { Write title string }
  4886. END;
  4887. {--TWindow------------------------------------------------------------------}
  4888. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 11Aug99 LdB }
  4889. {---------------------------------------------------------------------------}
  4890. PROCEDURE TWindow.HandleEvent (Var Event: TEvent);
  4891. VAR {$IFDEF OS_DOS} I, J: Integer; {$ENDIF} Min, Max: TPoint; Limits: TRect;
  4892. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  4893. PROCEDURE DragWindow (Mode: Byte);
  4894. VAR Limits: TRect; Min, Max: TPoint;
  4895. BEGIN
  4896. Owner^.GetExtent(Limits); { Get owner extents }
  4897. SizeLimits(Min, Max); { Restrict size }
  4898. DragView(Event, DragMode OR Mode, Limits, Min,
  4899. Max); { Drag the view }
  4900. ClearEvent(Event); { Clear the event }
  4901. END;
  4902. {$ENDIF}
  4903. BEGIN
  4904. Inherited HandleEvent(Event); { Call ancestor }
  4905. Case Event.What Of
  4906. evNothing: Exit; { Speeds up exit }
  4907. evCommand: { COMMAND EVENT }
  4908. Case Event.Command Of { Command type case }
  4909. cmResize: { RESIZE COMMAND }
  4910. If (Flags AND (wfMove + wfGrow) <> 0) { Window can resize }
  4911. AND (Owner <> Nil) Then Begin { Valid owner }
  4912. Owner^.GetExtent(Limits); { Owners extents }
  4913. SizeLimits(Min, Max); { Check size limits }
  4914. DragView(Event, DragMode OR (Flags AND
  4915. (wfMove + wfGrow)), Limits, Min, Max); { Drag the view }
  4916. ClearEvent(Event); { Clear the event }
  4917. End;
  4918. cmClose: { CLOSE COMMAND }
  4919. If (Flags AND wfClose <> 0) AND { Close flag set }
  4920. ((Event.InfoPtr = Nil) OR { None specific close }
  4921. (Event.InfoPtr = @Self)) Then Begin { Close to us }
  4922. ClearEvent(Event); { Clear the event }
  4923. If (State AND sfModal = 0) Then Close { Non modal so close }
  4924. Else Begin { Modal window }
  4925. Event.What := evCommand; { Command event }
  4926. Event.Command := cmCancel; { Cancel command }
  4927. PutEvent(Event); { Place on queue }
  4928. ClearEvent(Event); { Clear the event }
  4929. End;
  4930. End;
  4931. cmZoom: { ZOOM COMMAND }
  4932. If (Flags AND wfZoom <> 0) AND { Zoom flag set }
  4933. ((Event.InfoPtr = Nil) OR { No specific zoom }
  4934. (Event.InfoPtr = @Self)) Then Begin
  4935. Zoom; { Zoom our window }
  4936. ClearEvent(Event); { Clear the event }
  4937. End;
  4938. End;
  4939. evBroadcast: { BROADCAST EVENT }
  4940. If (Event.Command = cmSelectWindowNum) AND
  4941. (Event.InfoInt = Number) AND { Select our number }
  4942. (Options AND ofSelectable <> 0) Then Begin { Is view selectable }
  4943. Select; { Select our view }
  4944. ClearEvent(Event); { Clear the event }
  4945. End;
  4946. evKeyDown: Begin { KEYDOWN EVENT }
  4947. Case Event.KeyCode Of
  4948. kbTab: Begin { TAB KEY }
  4949. FocusNext(False); { Select next view }
  4950. ClearEvent(Event); { Clear the event }
  4951. End;
  4952. kbShiftTab: Begin { SHIFT TAB KEY }
  4953. FocusNext(True); { Select prior view }
  4954. ClearEvent(Event); { Clear the event }
  4955. End;
  4956. End;
  4957. End;
  4958. {$IFDEF OS_DOS} { DOS/DPMI CODE ONLY }
  4959. evMouseDown: { MOUSE DOWN EVENT }
  4960. If (GOptions AND goTitled <> 0) Then Begin { Must have title area }
  4961. If (GOptions AND goThickFramed <> 0) Then
  4962. I := 5 Else { Thick frame adjust }
  4963. If (Options AND ofFramed <> 0) Then I := 1 { Frame adjust }
  4964. Else I := 0; { No frame size }
  4965. If (Event.Where.Y > (RawOrigin.Y + I)) AND
  4966. (Event.Where.Y < RawOrigin.Y+FontHeight+I)
  4967. Then Begin { Within top line }
  4968. If (Current <> Nil) AND
  4969. (Current^.Options AND ofSelectable <> 0)
  4970. Then Current^.FocusFromTop Else
  4971. FocusFromTop;
  4972. If (Flags AND wfClose <> 0) Then Begin { Has close icon }
  4973. J := I + FontWidth; { Set X value }
  4974. If (Event.Where.X > RawOrigin.X+J) AND
  4975. (Event.Where.X < RawOrigin.X+J+2*FontWidth)
  4976. Then Begin { In close area }
  4977. Event.What := evCommand; { Command event }
  4978. Event.Command := cmClose; { Close command }
  4979. Event.InfoPtr := Nil; { Clear pointer }
  4980. PutEvent(Event); { Put event on queue }
  4981. ClearEvent(Event); { Clear the event }
  4982. Exit; { Now exit }
  4983. End;
  4984. End;
  4985. If (Owner <> Nil) AND (Flags AND wfMove <> 0)
  4986. Then DragWindow(dmDragMove); { Drag the window }
  4987. End Else If (Event.Where.X >= RawOrigin.X + RawSize.X-2*FontWidth) AND
  4988. (Event.Where.Y >= RawOrigin.Y + RawSize.Y - FontHeight)
  4989. Then If (Flags AND wfGrow <> 0) Then { Check grow flags }
  4990. DragWindow(dmDragGrow); { Change window size }
  4991. End;
  4992. {$ENDIF}
  4993. End; { Event.What case end }
  4994. END;
  4995. {--TWindow------------------------------------------------------------------}
  4996. { SizeLimits -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  4997. {---------------------------------------------------------------------------}
  4998. PROCEDURE TWindow.SizeLimits (Var Min, Max: TPoint);
  4999. BEGIN
  5000. Inherited SizeLimits(Min, Max); { View size limits }
  5001. Min.X := MinWinSize.X; { Set min x size }
  5002. Min.Y := MinWinSize.Y; { Set min y size }
  5003. END;
  5004. {$IFNDEF OS_DOS}
  5005. {***************************************************************************}
  5006. { TWindow OBJECT WIN/NT/OS2 ONLY METHODS }
  5007. {***************************************************************************}
  5008. {--TWindow------------------------------------------------------------------}
  5009. { GetClassText -> Platforms WIN/NT/OS2 - Updated 18Jul99 LdB }
  5010. {---------------------------------------------------------------------------}
  5011. FUNCTION TWindow.GetClassText: String;
  5012. BEGIN
  5013. GetClassText := GetTitle(255); { Return window title }
  5014. END;
  5015. {--TWindow------------------------------------------------------------------}
  5016. { GetClassAttr -> Platforms WIN/NT/OS2 - Updated 17Mar98 LdB }
  5017. {---------------------------------------------------------------------------}
  5018. FUNCTION TWindow.GetClassAttr: LongInt;
  5019. VAR Li: LongInt;
  5020. BEGIN
  5021. Li := Inherited GetClassAttr; { Call ancestor }
  5022. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5023. If (Flags AND wfZoom <> 0) Then Li := Li OR { Check zoom flags }
  5024. ws_MinimizeBox OR ws_MaximizeBox; { Add min/max boxes }
  5025. If (Flags AND wfClose <> 0) Then { Check close option }
  5026. Li := Li OR ws_SysMenu; { Set menu flag }
  5027. Li := Li OR ws_ClipSiblings OR ws_ClipChildren; { Clip other windows }
  5028. {$ENDIF}
  5029. {$IFDEF OS_OS2} { OS2 CODE }
  5030. If (Flags AND wfZoom <> 0) Then Li := Li OR { Check zoom flags }
  5031. fcf_MinButton OR fcf_MaxButton; { Add min/max boxes }
  5032. If (Flags AND wfClose <> 0) Then { Check close option }
  5033. Li := Li OR fcf_SysMenu; { Set menu flag }
  5034. {$ENDIF}
  5035. GetClassAttr := Li; { Return masks }
  5036. END;
  5037. {$ENDIF}
  5038. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  5039. { UNCOMPLETED OBJECT METHODS }
  5040. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  5041. {--TView--------------------------------------------------------------------}
  5042. { Exposed -> Platforms DOS/DPMI/WIN/OS2 - Checked 17Sep97 LdB }
  5043. {---------------------------------------------------------------------------}
  5044. { This needs big help!!!!! }
  5045. FUNCTION TView.Exposed: Boolean;
  5046. VAR ViewPort: ViewPortType;
  5047. BEGIN
  5048. GetViewSettings(ViewPort); { Fetch viewport }
  5049. If (State AND sfVisible<>0) AND { View visible }
  5050. (State AND sfExposed<>0) AND { View exposed }
  5051. OverlapsArea(ViewPort.X1, ViewPort.Y1,
  5052. ViewPort.X2, ViewPort.Y2) Then Exposed := True { Must be exposed }
  5053. Else Exposed := False; { Is hidden }
  5054. END;
  5055. {--TView--------------------------------------------------------------------}
  5056. { GraphLine -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Sep99 LdB }
  5057. {---------------------------------------------------------------------------}
  5058. PROCEDURE TView.GraphLine (X1, Y1, X2, Y2: Integer; Colour: Byte);
  5059. VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF} { DOS/DPMI VARIABLES }
  5060. {$IFDEF OS_WINDOWS} I: Word; ODc: hDc; {$ENDIF} { WIN/NT VARIABLES }
  5061. {$IFDEF OS_OS2} I: LongInt; Lp: PointL; OPs: HPs; {$ENDIF}{ OS2 VARIABLES }
  5062. BEGIN
  5063. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5064. GetViewSettings(ViewPort); { Get viewport settings }
  5065. SetColor(Colour); { Set line colour }
  5066. Line(RawOrigin.X + X1 - ViewPort.X1,
  5067. RawOrigin.Y + Y1 - ViewPort.Y1, RawOrigin.X + X2
  5068. - ViewPort.X1, RawOrigin.Y + Y2-ViewPort.Y1); { Draw the line }
  5069. {$ENDIF}
  5070. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5071. If (HWindow <> 0) Then Begin { Valid window }
  5072. X1 := X1 - FrameSize; { Adjust X1 for frame }
  5073. X2 := X2 - FrameSize; { Adjust X2 for frame }
  5074. Y1 := Y1 - CaptSize; { Adjust Y1 for title }
  5075. Y2 := Y2 - CaptSize; { Adjust Y2 for title }
  5076. ODc := Dc; { Hold device context }
  5077. If (Dc = 0) Then Dc := GetDC(HWindow); { Create a context }
  5078. SelectObject(Dc, ColPen[Colour]); { Select line colour }
  5079. Case WriteMode Of
  5080. NormalPut: I := R2_CopyPen; { Normal overwrite }
  5081. AndPut: I := R2_MaskPen; { AND colour write }
  5082. OrPut: I := R2_MergePen; { OR colour write }
  5083. XorPut: I := R2_XORPen; { XOR colour write }
  5084. NotPut: I := R2_Not; { NOT colour write }
  5085. End;
  5086. SetRop2(Dc, I); { Set write mode }
  5087. {$IFDEF BIT_16} { 16 BIT WIN CODE }
  5088. WinProcs.MoveTo(Dc, X1, Y1); { Move to first point }
  5089. {$ELSE} { 32 BIT WIN/NT CODE }
  5090. MoveToEx(Dc, X1, Y1, Nil); { Move to first point }
  5091. {$ENDIF}
  5092. If (Abs(X2-X1) > 1) OR (Abs(Y2-Y1) > 1) Then { Not single point }
  5093. LineTo(Dc, X2, Y2); { Line to second point }
  5094. SetPixel(Dc, X2, Y2, ColRef[Colour]); { Draw last point }
  5095. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5096. Dc := ODc; { Reset held context }
  5097. End;
  5098. {$ENDIF}
  5099. {$IFDEF OS_OS2} { OS2 CODE }
  5100. If (HWindow <> 0) Then Begin { Valid window }
  5101. X1 := X1 - FrameSize; { Adjust X1 for frame }
  5102. X2 := X2 - FrameSize; { Adjust X2 for frame }
  5103. Y1 := Y1 - CaptSize; { Adjust Y1 for title }
  5104. Y2 := Y2 - CaptSize; { Adjust Y2 for title }
  5105. OPs := Ps; { Hold paint struct }
  5106. If (Ps = 0) Then Ps := WinGetPS(Client); { Create paint struct }
  5107. Case WriteMode Of
  5108. NormalPut: I := fm_Overpaint; { Normal overwrite }
  5109. AndPut: I := fm_And; { AND colour write }
  5110. OrPut: I := fm_Or; { OR colour write }
  5111. XorPut: I := fm_Xor; { XOR colour write }
  5112. NotPut: I := fm_Invert; { NOT colour write }
  5113. End;
  5114. GPISetMix(Ps, I); { Set write mode }
  5115. GPISetColor(Ps, ColRef[Colour]);
  5116. Lp.X := X1; { Transfer x1 value }
  5117. Lp.Y := RawSize.Y-Y1; { Transfer y1 value }
  5118. GPIMove(Ps, Lp); { Move to first point }
  5119. Lp.X := X2; { Transfer x2 value }
  5120. Lp.Y := RawSize.Y-Y2; { Transfer y2 value }
  5121. GPILine(Ps, Lp); { Line to second point }
  5122. If (OPs = 0) Then WinReleasePS(Ps); { Release paint struct }
  5123. Ps := OPs; { Reset held struct }
  5124. End;
  5125. {$ENDIF}
  5126. END;
  5127. PROCEDURE TView.GraphRectangle (X1, Y1, X2, Y2: Integer; Colour: Byte);
  5128. VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
  5129. {$IFDEF OS_WINDOWS} I: Word; ODc: hDc; {$ENDIF}
  5130. {$IFDEF OS_OS2} Lp: PointL; OPs: HPs; {$ENDIF}
  5131. BEGIN
  5132. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5133. SetColor(Colour); { Set line colour }
  5134. GetViewSettings(ViewPort);
  5135. Rectangle(RawOrigin.X + X1 - ViewPort.X1, RawOrigin.Y + Y1
  5136. - ViewPort.Y1, RawOrigin.X + X2 - ViewPort.X1,
  5137. RawOrigin.Y+Y2-ViewPort.Y1); { Draw a rectangle }
  5138. {$ENDIF}
  5139. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5140. If (HWindow <> 0) Then Begin { Valid window }
  5141. X1 := X1 - FrameSize;
  5142. X2 := X2 - FrameSize;
  5143. Y1 := Y1 - CaptSize;
  5144. Y2 := Y2 - CaptSize;
  5145. ODc := Dc; { Hold device context }
  5146. If (Dc = 0) Then Dc := GetDC(HWindow); { Create a context }
  5147. SelectObject(Dc, ColPen[Colour]);
  5148. Case WriteMode Of
  5149. NormalPut: I := R2_CopyPen; { Normal overwrite }
  5150. AndPut: I := R2_MaskPen; { AND colour write }
  5151. OrPut: I := R2_MergePen; { OR colour write }
  5152. XorPut: I := R2_XORPen; { XOR colour write }
  5153. NotPut: I := R2_Not; { NOT colour write }
  5154. End;
  5155. SetRop2(Dc, I);
  5156. {$IFDEF WIN32}
  5157. MoveToEx(Dc, X1, Y1, Nil); { Move to first point }
  5158. {$ELSE}
  5159. WinProcs.MoveTo(Dc, X1, Y1); { Move to first point }
  5160. {$ENDIF}
  5161. LineTo(Dc, X2, Y1); { Line to second point }
  5162. LineTo(Dc, X2, Y2); { Line to third point }
  5163. LineTo(Dc, X1, Y2); { Line to fourth point }
  5164. LineTo(Dc, X1, Y1); { Line to first point }
  5165. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5166. Dc := ODc; { Reset held context }
  5167. End;
  5168. {$ENDIF}
  5169. {$IFDEF OS_OS2} { OS2 CODE }
  5170. If (HWindow <> 0) Then Begin { Valid window }
  5171. X1 := X1 - FrameSize; { Adjust X1 for frame }
  5172. X2 := X2 - FrameSize; { Adjust X2 for frame }
  5173. Y1 := Y1 - CaptSize; { Adjust Y1 for title }
  5174. Y2 := Y2 - CaptSize; { Adjust Y2 for title }
  5175. OPs := Ps; { Hold paint struct }
  5176. If (Ps = 0) Then Ps := WinGetPS(Client); { Create paint struct }
  5177. GPISetColor(Ps, ColRef[Colour]); { Set colour }
  5178. Lp.X := X1; { Transfer x1 value }
  5179. Lp.Y := RawSize.Y-Y1; { Transfer y1 value }
  5180. GPIMove(Ps, Lp); { Move to first point }
  5181. Lp.X := X2; { Transfer x2 value }
  5182. Lp.Y := RawSize.Y-Y1; { Transfer y1 value }
  5183. GPILine(Ps, Lp); { Line to second point }
  5184. Lp.X := X2; { Transfer x2 value }
  5185. Lp.Y := RawSize.Y-Y2; { Transfer y2 value }
  5186. GPILine(Ps, Lp); { Line to third point }
  5187. Lp.X := X1; { Transfer x1 value }
  5188. Lp.Y := RawSize.Y-Y2; { Transfer y2 value }
  5189. GPILine(Ps, Lp); { Line to fourth point }
  5190. Lp.X := X1; { Transfer x1 value }
  5191. Lp.Y := RawSize.Y-Y1; { Transfer y1 value }
  5192. GPILine(Ps, Lp); { Line to first point }
  5193. If (OPs = 0) Then WinReleasePS(Ps); { Release paint struct }
  5194. Ps := OPs; { Reset held struct }
  5195. End;
  5196. {$ENDIF}
  5197. END;
  5198. {--TView--------------------------------------------------------------------}
  5199. { ClearArea -> Platforms DOS/DPMI/WIN/OS2 - Checked 19Sep97 LdB }
  5200. {---------------------------------------------------------------------------}
  5201. PROCEDURE TView.ClearArea (X1, Y1, X2, Y2: Integer; Colour: Byte);
  5202. VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
  5203. {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
  5204. {$IFDEF OS_OS2} Lp: PointL; OPs: HPs; {$ENDIF}
  5205. BEGIN
  5206. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5207. GetViewSettings(ViewPort); { Get viewport }
  5208. SetFillStyle(SolidFill, Colour); { Set colour up }
  5209. Bar(RawOrigin.X+X1-ViewPort.X1, RawOrigin.Y+Y1-
  5210. ViewPort.Y1, RawOrigin.X+X2-ViewPort.X1,
  5211. RawOrigin.Y+Y2-ViewPort.Y1); { Clear the area }
  5212. {$ENDIF}
  5213. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5214. If (HWindow <> 0) Then Begin { Valid window }
  5215. X1 := X1 - FrameSize; { Correct for frame }
  5216. Y1 := Y1 - CaptSize; { Correct for caption }
  5217. X2 := X2 - FrameSize; { Correct for frame }
  5218. Y2 := Y2 - CaptSize; { Correct for caption }
  5219. ODc := Dc; { Hold device context }
  5220. If (Dc = 0) Then Dc := GetDC(HWindow); { Create a context }
  5221. SelectObject(Dc, ColPen[Colour]);
  5222. SelectObject(Dc, ColBrush[Colour]);
  5223. {$IFNDEF PPC_SPEED}
  5224. Rectangle(Dc, X1, Y1, X2+1, Y2+1);
  5225. {$ELSE} { SPEEDSOFT SYBIL2+ }
  5226. WinGDI.Rectangle(Dc, X1, Y1, X2+1, Y2+1);
  5227. {$ENDIF}
  5228. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5229. Dc := ODc; { Reset held context }
  5230. End;
  5231. {$ENDIF}
  5232. {$IFDEF OS_OS2} { OS2 CODE }
  5233. If (HWindow <> 0) Then Begin { Valid window }
  5234. X1 := X1 - FrameSize; { Adjust X1 for frame }
  5235. X2 := X2 - FrameSize; { Adjust X2 for frame }
  5236. Y1 := Y1 - CaptSize; { Adjust Y1 for title }
  5237. Y2 := Y2 - CaptSize; { Adjust Y2 for title }
  5238. OPs := Ps; { Hold paint struct }
  5239. If (Ps = 0) Then Ps := WinGetPs(Client); { Create paint struct }
  5240. GpiSetColor(Ps, ColRef[Colour]);
  5241. Lp.X := X1;
  5242. Lp.Y := RawSize.Y-Y1;
  5243. GpiMove(Ps, Lp);
  5244. Lp.X := X2;
  5245. Lp.Y := RawSize.Y-Y2;
  5246. GpiBox(Ps, dro_Fill, Lp, 0, 0);
  5247. If (OPs = 0) Then WinReleasePS(Ps); { Release paint struct }
  5248. Ps := OPs; { Reset held struct }
  5249. End;
  5250. {$ENDIF}
  5251. END;
  5252. PROCEDURE TView.GraphArc (Xc, Yc: Integer; Sa, Ea: Real; XRad, YRad: Integer;
  5253. Colour: Byte);
  5254. CONST RadConv = 57.2957795130823229; { Degrees per radian }
  5255. VAR X1, Y1, X2, Y2: Integer; {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
  5256. BEGIN
  5257. {$IFDEF OS_WINDOWS}
  5258. Xc := Xc - FrameSize;
  5259. Yc := Yc - CaptSize;
  5260. {$ENDIF}
  5261. While (Ea < -360) Do Ea := Ea + 360; { Max of a full circle }
  5262. While (Ea > 360) Do Ea := Ea - 360; { Max of a full circle }
  5263. Sa := Sa/RadConv; { Convert to radians }
  5264. Ea := Ea/RadConv; { Convert to radians }
  5265. X1 := Xc + Round(Sin(Sa)*XRad); { Calc 1st x value }
  5266. Y1 := Yc - Round(Cos(Sa)*YRad); { Calc 1st y value }
  5267. X2 := Xc + Round(Sin(Sa+Ea)*XRad); { Calc 2nd x value }
  5268. Y2 := Yc - Round(Cos(Sa+Ea)*YRad); { Calc 2nd y value }
  5269. {$IFDEF OS_WINDOWS}
  5270. If (HWindow <> 0) Then Begin { Valid window }
  5271. ODc := Dc; { Hold device context }
  5272. If (Dc = 0) Then Dc := GetDC(HWindow); { Create a context }
  5273. SelectObject(Dc, ColPen[Colour]); { Pen colour }
  5274. If (XRad > 2 ) AND (YRAd > 2) Then Begin { Must exceed 2x2 arc }
  5275. If (Ea < 0) Then
  5276. Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
  5277. X1, Y1, X2, Y2) Else { Draw c/clkwise arc }
  5278. Arc(Dc, Xc-XRad, Yc+YRad, Xc+XRad, Yc-YRad,
  5279. X2, Y2, X1, Y1); { Draw clockwise arc }
  5280. End;
  5281. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5282. Dc := ODc; { Reset held context }
  5283. End;
  5284. {$ENDIF}
  5285. END;
  5286. PROCEDURE TView.FilletArc (Xc, Yc: Integer; Sa, Ea: Real; XRad, YRad, Ht: Integer;
  5287. Colour: Byte);
  5288. CONST RadConv = 57.2957795130823229; { Degrees per radian }
  5289. {$IFDEF OS_WINDOWS} VAR X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer; ODc: hDc; {$ENDIF}
  5290. BEGIN
  5291. {$IFDEF OS_WINDOWS}
  5292. If (HWindow <> 0) Then Begin { Valid window }
  5293. Xc := Xc - FrameSize;
  5294. Yc := Yc - CaptSize;
  5295. ODc := Dc; { Hold device context }
  5296. If (Dc = 0) Then Dc := GetDC(HWindow); { Create a context }
  5297. Ea := (Ea-Sa);
  5298. While (Ea<-360) Do Ea := Ea+360; { One lap only }
  5299. While (Ea>360) Do Ea := Ea-360; { One lap only }
  5300. X1 := Round(Sin(Sa/RadConv)*XRad);
  5301. Y1 := -Round(Cos(Sa/RadConv)*YRad); { Calc 1st values }
  5302. X2 := Round(Sin((Sa+Ea)/RadConv)*XRad);
  5303. Y2 := -Round(Cos((Sa+Ea)/RadConv)*YRad); { Calc 2nd values }
  5304. X3 := Round(Sin(Sa/RadConv)*(XRad+Ht));
  5305. Y3 := -Round(Cos(Sa/RadConv)*(YRad+Ht)); { Calc 3rd values }
  5306. X4 := Round(Sin((Sa+Ea)/RadConv)*(XRad+Ht));
  5307. Y4 := -Round(Cos((Sa+Ea)/RadConv)*(YRad+Ht)); { Calc 4th values }
  5308. SelectObject(Dc, ColPen[Colour]); { Pen colour }
  5309. {$IFDEF WIN32}
  5310. MoveToEx(Dc, Xc+X1, Yc+Y1, Nil); { Move to first point }
  5311. {$ELSE}
  5312. WinProcs.MoveTo(Dc, Xc+X1, Yc+Y1); { Move to first point }
  5313. {$ENDIF}
  5314. LineTo(Dc, Xc+X3, Yc+Y3);
  5315. {$IFDEF WIN32}
  5316. MoveToEx(Dc, Xc+X2, Yc+Y2, Nil);
  5317. {$ELSE}
  5318. WinProcs.MoveTo(Dc, Xc+X2, Yc+Y2);
  5319. {$ENDIF}
  5320. LineTo(Dc, Xc+X4, Yc+Y4);
  5321. If (Ea < 0) Then
  5322. Arc(Dc, Xc-XRad-Ht, Yc-YRad-Ht, Xc+XRad+Ht, Yc+YRad+Ht,
  5323. Xc+X1, Yc+Y1, Xc+X2, Yc+Y2) Else
  5324. Arc(Dc, Xc-XRad-Ht, Yc-YRad-Ht, Xc+XRad+Ht, Yc+YRad+Ht,
  5325. Xc+X2, Yc+Y2, Xc+X1, Yc+Y1); { Draw arc }
  5326. If (Ea < 0) Then
  5327. Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
  5328. Xc+X3, Yc+Y3, Xc+X4, Yc+Y4) Else
  5329. Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
  5330. Xc+X4, Yc+Y4, Xc+X3, Yc+Y3); { Draw arc }
  5331. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5332. Dc := ODc; { Reset held context }
  5333. End;
  5334. {$ENDIF}
  5335. END;
  5336. {--TView--------------------------------------------------------------------}
  5337. { BiColorRectangle -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06May98 LdB }
  5338. {---------------------------------------------------------------------------}
  5339. PROCEDURE TView.BicolorRectangle (X1, Y1, X2, Y2: Integer; Light, Dark: Byte;
  5340. Down: Boolean);
  5341. VAR UpperLeft, RightDown: Byte;
  5342. BEGIN
  5343. If Down Then Begin
  5344. UpperLeft := Dark; { Dark upper left }
  5345. RightDown := Light; { Light down }
  5346. End Else Begin
  5347. UpperLeft := Light; { Light upper left }
  5348. RightDown := Dark; { Dark down }
  5349. End;
  5350. GraphLine(X1, Y1, X1, Y2, UpperLeft); { Draw left side }
  5351. GraphLine(X1, Y1, X2, Y1, UpperLeft); { Draw top line }
  5352. GraphLine(X1, Y2, X2, Y2, RightDown); { Draw bottom line }
  5353. GraphLine(X2, Y1, X2, Y2, RightDown); { Draw right line }
  5354. END;
  5355. PROCEDURE TView.WriteBuf (X, Y, W, H: Integer; Var Buf);
  5356. VAR I, J, K, L, CW: Integer; P: PDrawBuffer;
  5357. {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
  5358. {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
  5359. {$IFDEF OS_OS2} OPs: HPs; Pt: PointL; {$ENDIF}
  5360. BEGIN
  5361. If (State AND sfVisible <> 0) AND { View is visible }
  5362. (State AND sfIconised = 0) AND { View is not icon}
  5363. (State AND sfExposed <> 0) AND (W > 0) AND (H > 0) { View is exposed }
  5364. {$IFNDEF OS_DOS} AND (HWindow <> 0) {$ENDIF} { WIN/NT/OS2 CODE }
  5365. Then Begin
  5366. P := @TDrawBuffer(Buf); { Set draw buffer ptr }
  5367. L := 0; { Set buffer position }
  5368. If (GOptions AND (goGraphical + goGraphView)= 0) Then Begin { Not raw graphical }
  5369. X := X * SysFontWidth; { X graphical adjust }
  5370. Y := Y * SysFontHeight; { Y graphical adjust }
  5371. End;
  5372. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5373. GetViewSettings(ViewPort); { Get current viewport }
  5374. X := X + RawOrigin.X - ViewPort.X; { Calc x position }
  5375. Y := Y + RawOrigin.Y - ViewPort.Y; { Calc y position }
  5376. {$ENDIF}
  5377. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5378. ODc := Dc; { Hold device context }
  5379. If (Dc = 0) Then Dc := GetDC(HWindow); { If needed get context }
  5380. SelectObject(Dc, DefGFVFont); { Select the font }
  5381. {$ENDIF}
  5382. {$IFDEF OS_OS2} { OS2 CODE }
  5383. OPs := Ps; { Hold pres space }
  5384. If (Ps = 0) Then Ps := WinGetPS(Client); { If needed get PS }
  5385. GPISetCharSet(Ps, DefGFVFont); { Select the font }
  5386. GpiSetBackMix(Ps, bm_OverPaint); { Set overpaint mode }
  5387. {$ENDIF}
  5388. For J := 1 To H Do Begin { For each line }
  5389. K := X; { Reset x position }
  5390. For I := 0 To (W-1) Do Begin { For each character }
  5391. Cw := TextWidth(Chr(Lo(P^[L]))); { Width of this char }
  5392. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5393. SetFillStyle(SolidFill, Hi(P^[L]) AND $F0
  5394. SHR 4); { Set back colour }
  5395. SetColor(Hi(P^[L]) AND $0F); { Set text colour }
  5396. Bar(K, Y, K+Cw, Y+FontHeight-1); { Clear text backing }
  5397. OutTextXY(K, Y+2, Chr(Lo(P^[L]))); { Write text char }
  5398. {$ENDIF}
  5399. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5400. SetBkColor(Dc, ColRef[Hi(P^[L]) AND $F0
  5401. SHR 4]); { Set back colour }
  5402. SetTextColor(Dc, ColRef[Hi(P^[L])
  5403. AND $0F]); { Set text colour }
  5404. TextOut(Dc, K, Y, @P^[L], 1); { Write text char }
  5405. {$ENDIF}
  5406. {$IFDEF OS_OS2} { OS2 CODE }
  5407. GPISetBackColor(Ps, ColRef[Hi(P^[L])
  5408. AND $F0 SHR 4]); { Set back colour }
  5409. GpiSetColor(Ps, ColRef[Hi(P^[L])
  5410. AND $0F]); { Set text colour }
  5411. Pt.X := K;
  5412. Pt.Y := RawSize.Y - Y - FontHeight + 5;
  5413. GpiCharStringAt(Ps, Pt, 1, @P^[L]); { Write text char }
  5414. {$ENDIF}
  5415. K := K + Cw; { Add char width }
  5416. Inc(L); { Next character }
  5417. End;
  5418. Y := Y + SysFontHeight; { Next line down }
  5419. End;
  5420. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5421. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5422. Dc := ODc; { Restore old context }
  5423. {$ENDIF}
  5424. {$IFDEF OS_OS2} { OS2 CODE }
  5425. If (OPs = 0) Then WinReleasePS(Ps); { Release pres space }
  5426. Ps := OPs; { Restore original PS }
  5427. {$ENDIF}
  5428. End;
  5429. END;
  5430. PROCEDURE TView.WriteLine (X, Y, W, H: Integer; Var Buf);
  5431. VAR I, J, K, Cw: Integer; P: PDrawBuffer;
  5432. {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
  5433. {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
  5434. {$IFDEF OS_OS2} OPs: HPs; Pt: PointL; {$ENDIF}
  5435. BEGIN
  5436. If (State AND sfVisible <> 0) AND { View is visible }
  5437. (State AND sfIconised = 0) AND { View is not icon}
  5438. (State AND sfExposed <> 0) AND (W > 0) AND (H > 0) { View is exposed }
  5439. {$IFNDEF OS_DOS} AND (HWindow <> 0) {$ENDIF} { WIN/NT/OS2 CODE }
  5440. Then Begin
  5441. P := @TDrawBuffer(Buf); { Set draw buffer ptr }
  5442. If (GOptions AND (goGraphical + goGraphView)= 0) Then Begin { Not raw graphical }
  5443. X := X * SysFontWidth; { X graphical adjust }
  5444. Y := Y * SysFontHeight; { Y graphical adjust }
  5445. End;
  5446. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5447. GetViewSettings(ViewPort); { Get current viewport }
  5448. X := X + RawOrigin.X - ViewPort.X; { Calc x position }
  5449. Y := Y + RawOrigin.Y - ViewPort.Y; { Calc y position }
  5450. {$ENDIF}
  5451. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5452. ODc := Dc; { Hold device context }
  5453. If (Dc = 0) Then Dc := GetDC(HWindow); { If needed get context }
  5454. SelectObject(Dc, DefGFVFont); { Select the font }
  5455. {$ENDIF}
  5456. {$IFDEF OS_OS2} { OS2 CODE }
  5457. OPs := Ps; { Hold pres space }
  5458. If (Ps = 0) Then Ps := WinGetPS(Client); { If needed get PS }
  5459. GPISetCharSet(Ps, DefGFVFont); { Select the font }
  5460. GpiSetBackMix(Ps, bm_OverPaint); { Set overpaint mode }
  5461. {$ENDIF}
  5462. For J := 1 To H Do Begin { For each line }
  5463. K := X; { Reset x position }
  5464. For I := 0 To (W-1) Do Begin { For each character }
  5465. Cw := TextWidth(Chr(Lo(P^[I]))); { Width of this char }
  5466. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5467. SetFillStyle(SolidFill, Hi(P^[I]) AND $F0
  5468. SHR 4); { Set back colour }
  5469. SetColor(Hi(P^[I]) AND $0F); { Set text colour }
  5470. Bar(K, Y, K+Cw, Y+FontHeight-1); { Clear text backing }
  5471. OutTextXY(K, Y+2, Chr(Lo(P^[I]))); { Write text char }
  5472. {$ENDIF}
  5473. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5474. SetBkColor(Dc, ColRef[Hi(P^[I]) AND $F0
  5475. SHR 4]); { Set back colour }
  5476. SetTextColor(Dc, ColRef[Hi(P^[I])
  5477. AND $0F]); { Set text colour }
  5478. TextOut(Dc, K, Y, @P^[I], 1); { Write text char }
  5479. {$ENDIF}
  5480. {$IFDEF OS_OS2} { OS2 CODE }
  5481. GPISetBackColor(Ps, ColRef[Hi(P^[I])
  5482. AND $F0 SHR 4]); { Set back colour }
  5483. GpiSetColor(Ps, ColRef[Hi(P^[I])
  5484. AND $0F]); { Set text colour }
  5485. Pt.X := K;
  5486. Pt.Y := RawSize.Y - Y - FontHeight + 5;
  5487. GpiCharStringAt(Ps, Pt, 1, @P^[I]); { Write text char }
  5488. {$ENDIF}
  5489. K := K + Cw; { Add char width }
  5490. End;
  5491. Y := Y + SysFontHeight; { Next line down }
  5492. End;
  5493. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5494. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5495. Dc := ODc; { Restore old context }
  5496. {$ENDIF}
  5497. {$IFDEF OS_OS2} { OS2 CODE }
  5498. If (OPs = 0) Then WinReleasePS(Ps); { Release pres space }
  5499. Ps := OPs; { Restore original PS }
  5500. {$ENDIF}
  5501. End;
  5502. END;
  5503. {--TView--------------------------------------------------------------------}
  5504. { MakeLocal -> Platforms DOS/DPMI/WIN/OS2 - Checked 12Sep97 LdB }
  5505. {---------------------------------------------------------------------------}
  5506. PROCEDURE TView.MakeLocal (Source: TPoint; Var Dest: TPoint);
  5507. BEGIN
  5508. If (Options AND ofGFVModeView <> 0) Then Begin { GFV MODE TVIEW }
  5509. Dest.X := (Source.X-RawOrigin.X) DIV FontWidth; { Local x value }
  5510. Dest.Y := (Source.Y-RawOrigin.Y) DIV FontHeight; { Local y value }
  5511. End Else Begin { OLD MODE TVIEW }
  5512. Dest.X := Source.X - Origin.X; { Local x value }
  5513. Dest.Y := Source.Y - Origin.Y; { Local y value }
  5514. End;
  5515. END;
  5516. {--TView--------------------------------------------------------------------}
  5517. { MakeGlobal -> Platforms DOS/DPMI/WIN/OS2 - Checked 12Sep97 LdB }
  5518. {---------------------------------------------------------------------------}
  5519. PROCEDURE TView.MakeGlobal (Source: TPoint; Var Dest: TPoint);
  5520. BEGIN
  5521. If (Options AND ofGFVModeView <> 0) Then Begin { GFV MODE TVIEW }
  5522. Dest.X := Source.X*FontWidth + RawOrigin.X; { Global x value }
  5523. Dest.Y := Source.Y*FontHeight + RawOrigin.Y; { Global y value }
  5524. End Else Begin { OLD MODE TVIEW }
  5525. Dest.X := Source.X + Origin.X; { Global x value }
  5526. Dest.Y := Source.Y + Origin.Y; { Global y value }
  5527. End;
  5528. END;
  5529. PROCEDURE TView.WriteStr (X, Y: Integer; Str: String; Color: Byte);
  5530. VAR Fc, Bc: Byte; X1, Y1, X2, Y2: Integer;
  5531. {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
  5532. {$IFDEF OS_WINDOWS} ODc: HDc; P: Pointer; {$ENDIF}
  5533. {$IFDEF OS_OS2} OPs: HPs; P: Pointer; Pt: PointL; {$ENDIF}
  5534. BEGIN
  5535. If (State AND sfVisible <> 0) AND { View is visible }
  5536. (State AND sfExposed <> 0) AND { View is exposed }
  5537. (State AND sfIconised = 0) AND { View not iconized }
  5538. (Length(Str) > 0) Then Begin { String is valid }
  5539. Fc := GetColor(Color); { Get view color }
  5540. Bc := Fc AND $F0 SHR 4; { Calc back colour }
  5541. Fc := Fc AND $0F; { Calc text colour }
  5542. {$IFDEF OS_DOS}
  5543. If (X >= 0) AND (Y >= 0) Then Begin
  5544. X := RawOrigin.X+X*FontWidth; { X position }
  5545. Y := RawOrigin.Y+Y*FontHeight; { Y position }
  5546. End Else Begin
  5547. X := RawOrigin.X + Abs(X);
  5548. Y := RawOrigin.Y + Abs(Y);
  5549. End;
  5550. GetViewSettings(ViewPort);
  5551. SetFillStyle(SolidFill, Bc); { Set fill style }
  5552. Bar(X-ViewPort.X1, Y-ViewPort.Y1,
  5553. X-ViewPort.X1+Length(Str)*FontWidth, Y-ViewPort.Y1+FontHeight-1);
  5554. SetColor(Fc);
  5555. OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1+2, Str); { Write text char }
  5556. {$ENDIF}
  5557. {$IFDEF OS_WINDOWS}
  5558. If (HWindow <> 0) Then Begin
  5559. ODc := Dc; { Hold device handle }
  5560. If (Dc = 0) Then Dc := GetDC(HWindow); { Chk capture context }
  5561. SelectObject(Dc, DefGFVFont);
  5562. SetTextColor(Dc, ColRef[Fc]); { Set text colour }
  5563. SetBkColor(Dc, ColRef[Bc]); { Set back colour }
  5564. If (GOptions AND goGraphView <> 0) OR (X < 0)
  5565. OR (Y < 0) Then Begin
  5566. X := Abs(X);
  5567. Y := Abs(Y);
  5568. X1 := X - FrameSize; { Left position }
  5569. Y1 := Y - CaptSize; { Top position }
  5570. X2 := X1 + TextWidth(Str); { Right position }
  5571. End Else Begin
  5572. X1 := X * FontWidth - FrameSize; { Left position }
  5573. Y1 := Y * FontHeight - CaptSize; { Top position }
  5574. X2 := X1 + Length(Str)*FontWidth; { Right position }
  5575. End;
  5576. Y2 := Y1 + FontHeight; { Bottom position }
  5577. SelectObject(Dc, ColPen[Bc]); { Select pen }
  5578. SelectObject(Dc, ColBrush[Bc]); { Select brush }
  5579. P := @Str[1];
  5580. Rectangle(Dc, X1, Y1, X2, Y2); { Clear the area }
  5581. {$IFNDEF PPC_SPEED}
  5582. TextOut(Dc, X1, Y1, P, Length(Str)); { Write text data }
  5583. {$ELSE} { SPEEDSOFT SYBIL2+ }
  5584. TextOut(Dc, X1, Y1, CString(P), Length(Str)); { Write text data }
  5585. {$ENDIF}
  5586. If (ODc = 0) Then ReleaseDC(HWindow, Dc); { Release context }
  5587. Dc := ODc; { Clear device handle }
  5588. End;
  5589. {$ENDIF}
  5590. {$IFDEF OS_OS2}
  5591. If (HWindow <> 0) Then Begin
  5592. OPs := Ps; { Hold device handle }
  5593. If (Ps = 0) Then Ps := WinGetPs(Client); { Chk capture context }
  5594. {SelectObject(Dc, DefGFVFont);}
  5595. If (GOptions AND goGraphView <> 0) OR (X < 0)
  5596. OR (Y < 0) Then Begin
  5597. X := Abs(X);
  5598. Y := Abs(Y);
  5599. X1 := X - FrameSize; { Left position }
  5600. Y1 := Y - CaptSize; { Top position }
  5601. X2 := X1 + TextWidth(Str); { Right position }
  5602. End Else Begin
  5603. X1 := X * FontWidth - FrameSize; { Left position }
  5604. Y1 := Y * FontHeight - CaptSize; { Top position }
  5605. X2 := X1 + Length(Str)*FontWidth; { Right position }
  5606. End;
  5607. Y2 := Y1 + FontHeight; { Bottom position }
  5608. {SelectObject(Dc, ColPen[Bc]);} { Select pen }
  5609. {SelectObject(Dc, ColBrush[Bc]);} { Select brush }
  5610. P := @Str[1];
  5611. (*Pt.X := X1;
  5612. Pt.Y := RawSize.Y - Y1;
  5613. GpiMove(Ps, Pt);
  5614. Pt.X := X2;
  5615. Pt.Y := RawSize.Y - Y2;
  5616. GpiSetColor(Ps, ColRef[Bc]); { Set text colour }
  5617. GpiBox(Ps, dro_Fill, Pt, 0, 0);*)
  5618. GpiSetColor(Ps, ColRef[Fc]); { Set text colour }
  5619. GpiSetBackColor(Ps, ColRef[Bc]); { Set back colour }
  5620. GpiSetBackMix(Ps, bm_OverPaint );
  5621. Pt.X := X1;
  5622. Pt.Y := RawSize.Y - Y1 - FontHeight + 5;
  5623. GpiCharStringAt(Ps, Pt, Length(Str), P); { Write text char }
  5624. If (OPs = 0) Then WinReleasePs(Ps); { Release context }
  5625. Ps := OPs; { Clear device handle }
  5626. End;
  5627. {$ENDIF}
  5628. End;
  5629. END;
  5630. PROCEDURE TView.WriteChar (X, Y: Integer; C: Char; Color: Byte;
  5631. Count: Integer);
  5632. VAR Fc, Bc: Byte; I: Integer; Col: Word; S: String; ViewPort: ViewPortType;
  5633. BEGIN
  5634. {$IFDEF OS_DOS}
  5635. If (State AND sfVisible <> 0) AND { View visible }
  5636. (State AND sfExposed <> 0) Then Begin { View exposed }
  5637. GetViewSettings(ViewPort);
  5638. Col := GetColor(Color); { Get view color }
  5639. Fc := Col AND $0F; { Foreground colour }
  5640. Bc := Col AND $F0 SHR 4; { Background colour }
  5641. X := RawOrigin.X + X*FontWidth; { X position }
  5642. Y := RawOrigin.Y + Y*FontHeight; { Y position }
  5643. FillChar(S[1], 255, C); { Fill the string }
  5644. While (Count>0) Do Begin
  5645. If (Count>255) Then I := 255 Else I := Count; { Size to make }
  5646. S[0] := Chr(I); { Set string length }
  5647. SetFillStyle(SolidFill, Bc); { Set fill style }
  5648. Bar(X-ViewPort.X1, Y-ViewPort.Y1,
  5649. X-ViewPort.X1+Length(S)*FontWidth, Y-ViewPort.Y1+FontHeight-1);
  5650. SetColor(Fc);
  5651. OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1, S); { Write text char }
  5652. Count := Count - I; { Subtract count }
  5653. X := X + I*FontWidth; { Move x position }
  5654. End;
  5655. End;
  5656. {$ENDIF}
  5657. END;
  5658. PROCEDURE TView.DragView (Event: TEvent; Mode: Byte; Var Limits: TRect;
  5659. MinSize, MaxSize: TPoint);
  5660. VAR PState: Word; Mouse, Q, R, P, S, Op1, Op2: TPoint; SaveBounds: TRect;
  5661. FUNCTION Min (I, J: Integer): Integer;
  5662. BEGIN
  5663. If (I < J) Then Min := I Else Min := J; { Select minimum }
  5664. END;
  5665. FUNCTION Max (I, J: Integer): Integer;
  5666. BEGIN
  5667. If (I > J) Then Max := I Else Max := J; { Select maximum }
  5668. END;
  5669. PROCEDURE MoveGrow (P, S: TPoint);
  5670. VAR R: TRect;
  5671. BEGIN
  5672. S.X := Min(Max(S.X, MinSize.X), MaxSize.X); { Minimum S.X value }
  5673. S.Y := Min(Max(S.Y, MinSize.Y), MaxSize.Y); { Minimum S.Y value }
  5674. P.X := Min(Max(P.X, Limits.A.X - S.X + 1),
  5675. Limits.B.X - 1); { Minimum P.X value }
  5676. P.Y := Min(Max(P.Y, Limits.A.Y - S.Y + 1),
  5677. Limits.B.Y - 1); { Mimimum P.Y value }
  5678. If (Mode AND dmLimitLoX <> 0) Then
  5679. P.X := Max(P.X, Limits.A.X); { Left side move }
  5680. If (Mode AND dmLimitLoY <> 0) Then
  5681. P.Y := Max(P.Y, Limits.A.Y); { Top side move }
  5682. If (Mode AND dmLimitHiX <> 0) Then
  5683. P.X := Min(P.X, Limits.B.X - S.X); { Right side move }
  5684. If (Mode AND dmLimitHiY <> 0) Then
  5685. P.Y := Min(P.Y, Limits.B.Y - S.Y); { Bottom side move }
  5686. R.Assign(P.X, P.Y, P.X + S.X, P.Y + S.Y); { Assign area }
  5687. Locate(R); { Locate view }
  5688. END;
  5689. PROCEDURE Change (DX, DY: Integer);
  5690. BEGIN
  5691. If (Mode AND dmDragMove <> 0) AND
  5692. (GetShiftState AND $03 = 0) Then Begin
  5693. Inc(P.X, DX); Inc(P.Y, DY); { Adjust values }
  5694. End Else If (Mode AND dmDragGrow <> 0) AND
  5695. (GetShiftState AND $03 <> 0) Then Begin
  5696. Inc(S.X, DX); Inc(S.Y, DY); { Adjust values }
  5697. End;
  5698. END;
  5699. PROCEDURE Update (X, Y: Integer);
  5700. BEGIN
  5701. If (Mode AND dmDragMove <> 0) Then Begin
  5702. P.X := X; P.Y := Y; { Adjust values }
  5703. End;
  5704. END;
  5705. BEGIN
  5706. SetState(sfDragging, True); { Set drag state }
  5707. If (Event.What = evMouseDown) Then Begin { Mouse down event }
  5708. Q.X := Event.Where.X DIV FontWidth - Origin.X; { Offset mouse x origin }
  5709. Q.Y := Event.Where.Y DIV FontHeight - Origin.Y; { Offset mouse y origin }
  5710. Op1.X := RawOrigin.X; Op1.Y := RawOrigin.Y; { Hold origin point }
  5711. Op2.X := RawOrigin.X+RawSize.X; { Right side x value }
  5712. Op2.Y := RawOrigin.Y+RawSize.Y; { Right side y value }
  5713. PState := State; { Hold current state }
  5714. State := State AND NOT sfVisible; { Temp not visible }
  5715. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5716. HideMouseCursor; { Hide the mouse }
  5717. {$ENDIF}
  5718. SetWriteMode(XORPut);
  5719. GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
  5720. SetWriteMode(NormalPut);
  5721. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5722. ShowMouseCursor; { Show the mouse }
  5723. {$ENDIF}
  5724. Repeat
  5725. Mouse.X := Round(Event.Where.X/FontWidth)-Q.X; { New x origin point }
  5726. Mouse.Y := Round(Event.Where.Y/FontHeight)-Q.Y;{ New y origin point }
  5727. If (Mode AND dmDragMove<>0) Then Begin
  5728. If (Owner<>Nil) Then Begin
  5729. Dec(Mouse.X, Owner^.Origin.X); { Sub owner x origin }
  5730. Dec(Mouse.Y, Owner^.Origin.Y); { Sub owner y origin }
  5731. End;
  5732. R := Mouse; Mouse := Size; { Exchange values }
  5733. End Else Begin
  5734. R := Origin; { Start at origin }
  5735. If (Owner<>Nil) Then Begin
  5736. Dec(R.X, Owner^.Origin.X); { Sub owner x origin }
  5737. Dec(R.Y, Owner^.Origin.Y); { Sub owner y origin }
  5738. End;
  5739. Mouse.X := Mouse.X+Q.X-Origin.X;
  5740. Mouse.Y := Mouse.Y+Q.Y-Origin.Y;
  5741. End;
  5742. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5743. HideMouseCursor; { Hide the mouse }
  5744. {$ENDIF}
  5745. SetWriteMode(XORPut);
  5746. GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
  5747. SetWriteMode(NormalPut);
  5748. MoveGrow(R, Mouse); { Resize the view }
  5749. SetWriteMode(XORPut);
  5750. GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
  5751. SetWriteMode(NormalPut);
  5752. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  5753. ShowMouseCursor; { Show the mouse }
  5754. {$ENDIF}
  5755. Until NOT MouseEvent(Event, evMouseMove); { Finished moving }
  5756. State := PState; { Restore view state }
  5757. If (Owner<>Nil) Then
  5758. Owner^.ReDrawArea(Op1.X, Op1.Y, Op2.X, Op2.Y); { Redraw old area }
  5759. SetState(sfDragging, False); { Clr dragging flag }
  5760. DrawView; { Now redraw the view }
  5761. End Else Begin
  5762. GetBounds(SaveBounds); { Get current bounds }
  5763. Repeat
  5764. P := Origin; S := Size; { Set values }
  5765. KeyEvent(Event); { Get key event }
  5766. Case Event.KeyCode AND $FF00 Of
  5767. kbLeft: Change(-1, 0); { Move left }
  5768. kbRight: Change(1, 0); { Move right }
  5769. kbUp: Change(0, -1); { Move up }
  5770. kbDown: Change(0, 1); { Move down }
  5771. kbCtrlLeft: Change(-8, 0);
  5772. kbCtrlRight: Change(8, 0);
  5773. kbHome: Update(Limits.A.X, P.Y);
  5774. kbEnd: Update(Limits.B.X - S.X, P.Y);
  5775. kbPgUp: Update(P.X, Limits.A.Y);
  5776. kbPgDn: Update(P.X, Limits.B.Y - S.Y);
  5777. End;
  5778. MoveGrow(P, S); { Now move the view }
  5779. Until (Event.KeyCode = kbEnter) OR
  5780. (Event.KeyCode = kbEsc);
  5781. If (Event.KeyCode=kbEsc) Then Locate(SaveBounds);{ Restore original }
  5782. End;
  5783. SetState(sfDragging, False); { Clr dragging flag }
  5784. END;
  5785. FUNCTION TView.FontWidth: Integer;
  5786. BEGIN
  5787. FontWidth := SysFontWidth;
  5788. END;
  5789. FUNCTION TView.FontHeight: Integer;
  5790. BEGIN
  5791. FontHeight := SysFontHeight;
  5792. END;
  5793. {$IFNDEF OS_DOS}
  5794. {***************************************************************************}
  5795. { TView OBJECT WIN/NT ONLY METHODS }
  5796. {***************************************************************************}
  5797. {--TView--------------------------------------------------------------------}
  5798. { CreateWindowNow -> Platforms WIN/NT/OS2 - Updated 17Mar98 LdB }
  5799. {---------------------------------------------------------------------------}
  5800. PROCEDURE TView.CreateWindowNow (CmdShow: Integer);
  5801. VAR Li: LongInt; S: String; Cp, Ct: Array[0..256] Of Char;
  5802. {$IFDEF OS_WINDOWS} VAR WndClass: TWndClass; {$ENDIF}
  5803. {$IFDEF OS_OS2} VAR P: Pointer; WndClass: ClassInfo; {$ENDIF}
  5804. BEGIN
  5805. If (HWindow = 0) Then Begin { Window not created }
  5806. S := GetClassName; { Fetch classname }
  5807. FillChar(Cp, SizeOf(Cp), #0); { Clear buffer }
  5808. Move(S[1], Cp, Length(S)); { Transfer classname }
  5809. S := GetClassText; { Fetch class text }
  5810. FillChar(Ct, SizeOf(Ct), #0); { Clear buffer }
  5811. Move(S[1], Ct, Length(S)); { Transfer class text }
  5812. If (GOptions AND goNativeClass = 0) AND { Not native class }
  5813. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  5814. {$IFNDEF PPC_SPEED}
  5815. {$IFDEF PPC_FPC}
  5816. NOT GetClassInfo(HInstance, Cp, @WndClass)
  5817. {$ELSE}
  5818. NOT GetClassInfo(HInstance, Cp, WndClass)
  5819. {$ENDIF}
  5820. {$ELSE} { SPEEDSOFT SYBIL2+ }
  5821. NOT GetClassInfo(0, CString(Cp), WndClass)
  5822. {$ENDIF}
  5823. Then Begin { Class not registered }
  5824. WndClass.Style := CS_HRedraw OR CS_VReDraw OR
  5825. CS_DBLClks; { Class styles }
  5826. {$IFDEF PPC_SPEED}
  5827. WndClass.lpfnWndProc:= WndProc(GetMsgHandler); { Message handler }
  5828. {$ELSE}
  5829. Pointer(WndClass.lpfnWndProc) := GetMsgHandler;{ Message handler }
  5830. {$ENDIF}
  5831. WndClass.cbClsExtra := 0; { No extra data }
  5832. WndClass.cbWndExtra := 0; { No extra data }
  5833. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  5834. WndClass.hInstance := 0;
  5835. WndClass.hIcon := Idi_Application; { Set icon }
  5836. {$ELSE}
  5837. WndClass.hInstance := HInstance; { Set instance }
  5838. WndClass.hIcon := LoadIcon(0, Idi_Application);{ Set icon }
  5839. {$ENDIF}
  5840. WndClass.hCursor := LoadCursor(0, Idc_Arrow); { Set cursor }
  5841. WndClass.hbrBackground := GetStockObject(
  5842. Null_Brush); { Class brush }
  5843. WndClass.lpszMenuName := Nil; { No menu }
  5844. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  5845. WndClass.lpszClassName := @Cp; { Set class name }
  5846. {$ELSE} { OTHER COMPILERS }
  5847. WndClass.lpszClassName := Cp; { Set class name }
  5848. {$ENDIF}
  5849. {$IFDEF BIT_32} { 32 BIT CODE }
  5850. If (RegisterClass(WndClass) = 0)
  5851. {$ENDIF}
  5852. {$IFDEF BIT_16} { 16 BIT CODE }
  5853. If (RegisterClass(WndClass) = False)
  5854. {$ENDIF}
  5855. Then Begin
  5856. MessageBox(GetFocus, 'Can not Register Class',
  5857. 'UnKnown Error Cause?', mb_OK); { Failed to register }
  5858. Halt; { Halt on failure }
  5859. End;
  5860. End;
  5861. If (GOptions AND goNativeClass <> 0) Then
  5862. Li := 1 Else Li := 0;
  5863. If (Owner <> Nil) AND (Owner^.HWindow <> 0) { Valid owner window }
  5864. Then HWindow := CreateWindowEx(ExStyle,
  5865. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  5866. CString(Cp), Ct, GetClassAttr OR ws_Child,
  5867. RawOrigin.X-Owner^.RawOrigin.X-Owner^.FrameSize,
  5868. RawOrigin.Y-Owner^.RawOrigin.Y-Owner^.CaptSize+Li,
  5869. RawSize.X+1,
  5870. RawSize.Y+1, Owner^.HWindow, GetClassId, 0, Nil)
  5871. {$ELSE}
  5872. Cp, Ct, GetClassAttr OR ws_Child,
  5873. RawOrigin.X-Owner^.RawOrigin.X-Owner^.FrameSize,
  5874. RawOrigin.Y-Owner^.RawOrigin.Y-Owner^.CaptSize+Li,
  5875. RawSize.X+1,
  5876. RawSize.Y+1, Owner^.HWindow, GetClassId, hInstance, Nil)
  5877. {$ENDIF}
  5878. Else HWindow := CreateWindowEx(ExStyle,
  5879. {$IFDEF PPC_SPEED} { SPEEDSOFT SYBIL2+ }
  5880. CString(Cp), Ct, GetClassAttr,
  5881. RawOrigin.X, RawOrigin.Y, RawSize.X+1, RawSize.Y+1,
  5882. AppWindow, GetClassId, 0, Nil); { Create the window }
  5883. {$ELSE}
  5884. Cp, Ct, GetClassAttr,
  5885. RawOrigin.X, RawOrigin.Y, RawSize.X+1, RawSize.Y+1,
  5886. AppWindow, GetClassId, hInstance, Nil); { Create the window }
  5887. {$ENDIF}
  5888. If (HWindow <> 0) Then Begin { Window created ok }
  5889. SendMessage(HWindow, WM_SetFont, DefGFVFont, 1);
  5890. Li := LongInt(@Self); { Address of self }
  5891. {$IFDEF BIT_16} { 16 BIT CODE }
  5892. SetProp(HWindow, ViewSeg, Li AND $FFFF0000
  5893. SHR 16); { Set seg property }
  5894. SetProp(HWindow, ViewOfs, Li AND $FFFF); { Set ofs propertry }
  5895. {$ENDIF}
  5896. {$IFDEF BIT_32} { 32 BIT CODE }
  5897. SetProp(HWindow, ViewPtr, Li ); { Set view property }
  5898. {$ENDIF}
  5899. If (CmdShow <> 0) Then
  5900. ShowWindow(HWindow, cmdShow); { Execute show cmd }
  5901. If (State AND sfVisible <> 0) Then Begin
  5902. UpdateWindow(HWindow); { Update the window }
  5903. BringWindowToTop(HWindow); { Bring window to top }
  5904. End;
  5905. If (State AND sfDisabled <> 0) Then
  5906. EnableWindow(HWindow, False); { Disable the window }
  5907. End;
  5908. {$ENDIF}
  5909. {$IFDEF OS_OS2} { OS2 CODE }
  5910. (WinQueryClassInfo(Anchor, Cp, WndClass) = False)
  5911. Then Begin { Class not registered }
  5912. P := GetMsgHandler; { Message handler }
  5913. If (WinRegisterClass(Anchor, Cp, P,
  5914. cs_SizeRedraw, SizeOf(Pointer))= False) { Register the class }
  5915. Then Begin
  5916. WinMessageBox(0, 0, 'Can not Register Class',
  5917. 'UnKnown Error Cause?', 0, mb_OK); { Failed to register }
  5918. Halt; { Halt on failure }
  5919. End;
  5920. End;
  5921. Li := GetClassAttr; { Class attributes }
  5922. If (Owner <> Nil) AND (Owner^.HWindow <> 0) { Valid owner window }
  5923. Then Begin
  5924. HWindow := WinCreateStdWindow(Owner^.Client,
  5925. 0, Li, Cp, Ct, lStyle, 0, 0, @Client);
  5926. If (HWindow <> 0) Then Begin { Window created ok }
  5927. Li := LongInt(@Self); { Address of self }
  5928. WinSetPresParam(Client, PP_User,
  5929. SizeOf(Pointer), @Li); { Hold as property }
  5930. WinSetWindowPos(HWindow, 0, RawOrigin.X-Owner^.RawOrigin.X,
  5931. (Owner^.RawOrigin.Y + Owner^.RawSize.Y) -
  5932. (RawOrigin.Y + RawSize.Y),
  5933. RawSize.X+1, RawSize.Y+1,
  5934. swp_Move + swp_Size + swp_Activate + swp_Show);
  5935. If (GOptions AND goNativeClass <> 0) Then Begin
  5936. WinSetOwner(Client, Owner^.Client);
  5937. End;
  5938. If (State AND sfDisabled <> 0) Then
  5939. WinEnableWindow(HWindow, False); { Disable the window }
  5940. End;
  5941. End Else Begin
  5942. HWindow := WinCreateStdWindow(HWND_Desktop,
  5943. 0, Li, Cp, Ct, lStyle, 0, 0, @Client);
  5944. If (HWindow <> 0) Then Begin { Window created ok }
  5945. Li := LongInt(@Self); { Address of self }
  5946. WinSetPresParam(Client, PP_User,
  5947. SizeOf(Pointer), @Li); { Hold as property }
  5948. WinSetWindowPos(HWindow, 0, RawOrigin.X,
  5949. WinQuerySysValue(hwnd_Desktop, sv_CyScreen)-RawSize.Y,
  5950. RawSize.X, RawSize.Y,
  5951. swp_Move + swp_Size + swp_Activate OR cmdShow);
  5952. End;
  5953. End;
  5954. {$ENDIF}
  5955. End;
  5956. END;
  5957. {$ENDIF}
  5958. {ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝ}
  5959. {Þ TScroller OBJECT METHODS Ý}
  5960. {ÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ}
  5961. PROCEDURE TScroller.ScrollDraw;
  5962. VAR D: TPoint;
  5963. BEGIN
  5964. If (HScrollBar<>Nil) Then D.X := HScrollBar^.Value
  5965. Else D.X := 0; { Horz scroll value }
  5966. If (VScrollBar<>Nil) Then D.Y := VScrollBar^.Value
  5967. Else D.Y := 0; { Vert scroll value }
  5968. If (D.X<>Delta.X) OR (D.Y<>Delta.Y) Then Begin { View has moved }
  5969. SetCursor(Cursor.X+Delta.X-D.X,
  5970. Cursor.Y+Delta.Y-D.Y); { Move the cursor }
  5971. Delta := D; { Set new delta }
  5972. If (DrawLock<>0) Then DrawFlag := True { Draw will need draw }
  5973. Else DrawView; { Redraw the view }
  5974. End;
  5975. END;
  5976. PROCEDURE TScroller.SetLimit (X, Y: Integer);
  5977. VAR PState: Word;
  5978. BEGIN
  5979. Limit.X := X; { Hold x limit }
  5980. Limit.Y := Y; { Hold y limit }
  5981. Inc(DrawLock); { Set draw lock }
  5982. If (HScrollBar<>Nil) Then Begin
  5983. PState := HScrollBar^.State; { Hold bar state }
  5984. HScrollBar^.State := PState AND NOT sfVisible; { Temp not visible }
  5985. HScrollBar^.SetParams(HScrollBar^.Value, 0,
  5986. X-Size.X, Size.X-1, HScrollBar^.ArStep); { Set horz scrollbar }
  5987. HScrollBar^.State := PState; { Restore bar state }
  5988. End;
  5989. If (VScrollBar<>Nil) Then Begin
  5990. PState := VScrollBar^.State; { Hold bar state }
  5991. VScrollBar^.State := PState AND NOT sfVisible; { Temp not visible }
  5992. VScrollBar^.SetParams(VScrollBar^.Value, 0,
  5993. Y-Size.Y, Size.Y-1, VScrollBar^.ArStep); { Set vert scrollbar }
  5994. VScrollBar^.State := PState; { Restore bar state }
  5995. End;
  5996. Dec(DrawLock); { Release draw lock }
  5997. CheckDraw; { Check need to draw }
  5998. END;
  5999. {***************************************************************************}
  6000. { TScroller OBJECT PRIVATE METHODS }
  6001. {***************************************************************************}
  6002. PROCEDURE TScroller.CheckDraw;
  6003. BEGIN
  6004. If (DrawLock = 0) AND DrawFlag Then Begin { Clear & draw needed }
  6005. DrawFlag := False; { Clear draw flag }
  6006. DrawView; { Draw now }
  6007. End;
  6008. END;
  6009. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6010. { TGroup OBJECT METHODS }
  6011. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6012. {--TGroup-------------------------------------------------------------------}
  6013. { Lock -> Platforms DOS/DPMI/WIN/OS2 - Checked 23Sep97 LdB }
  6014. {---------------------------------------------------------------------------}
  6015. PROCEDURE TGroup.Lock;
  6016. BEGIN
  6017. If (Buffer <> Nil) OR (LockFlag <> 0)
  6018. Then Inc(LockFlag); { Increment count }
  6019. END;
  6020. {--TGroup-------------------------------------------------------------------}
  6021. { UnLock -> Platforms DOS/DPMI/WIN/OS2 - Checked 23Sep97 LdB }
  6022. {---------------------------------------------------------------------------}
  6023. PROCEDURE TGroup.Unlock;
  6024. BEGIN
  6025. If (LockFlag <> 0) Then Begin
  6026. Dec(LockFlag); { Decrement count }
  6027. {If (LockFlag = 0) Then DrawView;} { Lock release draw }
  6028. End;
  6029. END;
  6030. PROCEDURE TWindow.DrawBorder;
  6031. VAR Fc, Bc: Byte; X, Y: Integer; S: String; ViewPort: ViewPortType;
  6032. BEGIN
  6033. {$IFDEF OS_DOS}
  6034. Fc := GetColor(2) AND $0F; { Foreground colour }
  6035. Bc := 9; { Background colour }
  6036. If (Options AND ofFramed<>0) Then Y := 1
  6037. Else Y := 0; { Initial value }
  6038. If (GOptions AND goThickFramed<>0) Then Inc(Y, 3); { Adjust position }
  6039. ClearArea(0, Y, RawSize.X, Y+FontHeight, Bc); { Clear background }
  6040. If (Title<>Nil) AND (GOptions AND goTitled<>0)
  6041. Then Begin { View has a title }
  6042. GetViewSettings(ViewPort);
  6043. X := (RawSize.X DIV 2); { Half way point }
  6044. X := X - (Length(Title^)*FontWidth) DIV 2; { Calc start point }
  6045. SetColor(Fc);
  6046. OutTextXY(RawOrigin.X+X-ViewPort.X1,
  6047. RawOrigin.Y+Y+1-ViewPort.Y1+2, Title^); { Write the title }
  6048. End;
  6049. If (Number>0) AND (Number<10) Then Begin { Valid number }
  6050. Str(Number, S); { Make number string }
  6051. SetColor(GetColor(2) AND $0F);
  6052. OutTextXY(RawOrigin.X+RawSize.X-2*FontWidth-ViewPort.X1,
  6053. RawOrigin.Y+Y+1-ViewPort.Y1+2, S); { Write number }
  6054. End;
  6055. If (Flags AND wfClose<>0) Then Begin { Close icon request }
  6056. SetColor(Fc);
  6057. OutTextXY(RawOrigin.X+Y+FontWidth-ViewPort.X1,
  6058. RawOrigin.Y+Y+1-ViewPort.Y1+2, '[*]'); { Write close icon }
  6059. End;
  6060. If (Flags AND wfZoom<>0) Then Begin
  6061. SetColor(GetColor(2) AND $0F);
  6062. OutTextXY(RawOrigin.X+RawSize.X-4*FontWidth-Y-ViewPort.X1,
  6063. RawOrigin.Y+Y+1-ViewPort.Y1+2, '['+#24+']'); { Write zoom icon }
  6064. End;
  6065. BiColorRectangle(Y+1, Y+1, RawSize.X-Y-1, Y+FontHeight,
  6066. White, DarkGray, False); { Draw 3d effect }
  6067. BiColorRectangle(Y+1, Y+1, RawSize.X-Y-2, Y+FontHeight-1,
  6068. White, DarkGray, False); { Draw 3d effect }
  6069. Inherited DrawBorder;
  6070. {$ENDIF}
  6071. END;
  6072. {***************************************************************************}
  6073. { INTERFACE ROUTINES }
  6074. {***************************************************************************}
  6075. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6076. { WINDOW MESSAGE ROUTINES }
  6077. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6078. {---------------------------------------------------------------------------}
  6079. { Message -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  6080. {---------------------------------------------------------------------------}
  6081. FUNCTION Message (Receiver: PView; What, Command: Word;
  6082. InfoPtr: Pointer): Pointer;
  6083. VAR Event: TEvent;
  6084. BEGIN
  6085. Message := Nil; { Preset nil }
  6086. If (Receiver <> Nil) Then Begin { Valid receiver }
  6087. Event.What := What; { Set what }
  6088. Event.Command := Command; { Set command }
  6089. Event.Id := 0; { Zero id field }
  6090. Event.Data := 0; { Zero data field }
  6091. Event.InfoPtr := InfoPtr; { Set info ptr }
  6092. Receiver^.HandleEvent(Event); { Pass to handler }
  6093. If (Event.What = evNothing) Then
  6094. Message := Event.InfoPtr; { Return handler }
  6095. End;
  6096. END;
  6097. {---------------------------------------------------------------------------}
  6098. { NewMessage -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19Sep97 LdB }
  6099. {---------------------------------------------------------------------------}
  6100. FUNCTION NewMessage (P: PView; What, Command: Word; Id: Integer;
  6101. Data: Real; InfoPtr: Pointer): Pointer;
  6102. VAR Event: TEvent;
  6103. BEGIN
  6104. NewMessage := Nil; { Preset failure }
  6105. If (P <> Nil) Then Begin
  6106. Event.What := What; { Set what }
  6107. Event.Command := Command; { Set event command }
  6108. Event.Id := Id; { Set up Id }
  6109. Event.Data := Data; { Set up data }
  6110. Event.InfoPtr := InfoPtr; { Set up event ptr }
  6111. P^.HandleEvent(Event); { Send to view }
  6112. If (Event.What = evNothing) Then
  6113. NewMessage := Event.InfoPtr; { Return handler }
  6114. End;
  6115. END;
  6116. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6117. { NEW VIEW ROUTINES }
  6118. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6119. {---------------------------------------------------------------------------}
  6120. { CreateIdScrollBar -> Platforms DOS/DPMI/WIN/NT/OS2 - Checked 22May97 LdB }
  6121. {---------------------------------------------------------------------------}
  6122. FUNCTION CreateIdScrollBar (X, Y, Size, Id: Integer; Horz: Boolean): PScrollBar;
  6123. VAR R: TRect; P: PScrollBar;
  6124. BEGIN
  6125. If Horz Then R.Assign(X, Y, X+Size, Y+1) Else { Horizontal bar }
  6126. R.Assign(X, Y, X+1, Y+Size); { Vertical bar }
  6127. P := New(PScrollBar, Init(R)); { Create scrollbar }
  6128. If (P <> Nil) Then Begin
  6129. P^.Id := Id; { Set scrollbar id }
  6130. P^.Options := P^.Options OR ofPostProcess; { Set post processing }
  6131. End;
  6132. CreateIdScrollBar := P; { Return scrollbar }
  6133. END;
  6134. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6135. { OBJECT REGISTRATION PROCEDURES }
  6136. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6137. {---------------------------------------------------------------------------}
  6138. { RegisterViews -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May97 LdB }
  6139. {---------------------------------------------------------------------------}
  6140. PROCEDURE RegisterViews;
  6141. BEGIN
  6142. RegisterType(RView); { Register views }
  6143. RegisterType(RFrame); { Register frame }
  6144. RegisterType(RScrollBar); { Register scrollbar }
  6145. RegisterType(RScroller); { Register scroller }
  6146. RegisterType(RListViewer); { Register listview }
  6147. RegisterType(RGroup); { Register group }
  6148. RegisterType(RWindow); { Register window }
  6149. END;
  6150. END.
  6151. {
  6152. $Log$
  6153. Revision 1.2 2000-08-24 12:00:22 marco
  6154. * CVS log and ID tags
  6155. }