| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891 |
- // cocoa.macos.m
- // blitzmax cocoa interface
- // removed lowfi pointer bitmaps
- // fixed xcode 5.1 compiler conformance
- #include <AppKit/AppKit.h>
- #include <WebKit/WebView.h>
- #include <WebKit/WebFrame.h>a
- #include <WebKit/WebPolicyDelegate.h>
- #include <WebKit/WebFrameLoadDelegate.h>
- #include <WebKit/WebDataSource.h>
- #include <ApplicationServices/ApplicationServices.h>
- #include <brl.mod/blitz.mod/blitz.h>
- #include <maxgui.mod/maxgui.mod/maxgui.h>
- #include <pub.mod/macos.mod/macos.h>
- #define STATUSBARHEIGHT 18
- void brl_event_EmitEvent(BBObject *event);
- BBObject *maxgui_maxgui_HotKeyEvent(int key,int mods);
- void maxgui_maxgui_DispatchGuiEvents();
- void maxgui_cocoamaxgui_EmitCocoaOSEvent(NSEvent *event,void *handle,BBObject *gadget);
- int maxgui_cocoamaxgui_EmitCocoaMouseEvent(NSEvent *event,void *handle);
- int maxgui_cocoamaxgui_EmitCocoaKeyEvent(NSEvent *event,void *handle);
- void maxgui_cocoamaxgui_PostCocoaGuiEvent(int ev,void *handle,int data,int mods,int x,int y,BBObject *extra);
- int maxgui_cocoamaxgui_FilterChar(void *handle,int key,int mods);
- int maxgui_cocoamaxgui_FilterKeyDown(void *handle,int key,int mods);
- static void EmitOSEvent(NSEvent *event,void *handle){
- maxgui_cocoamaxgui_EmitCocoaOSEvent(event,handle,&bbNullObject);
- }
- int HaltMouseEvents;
- static int EmitMouseEvent(NSEvent *event,void *handle){
- if(([event type] == NSScrollWheel) && ([event deltaY] == 0)) return 0;
- if(!HaltMouseEvents) return maxgui_cocoamaxgui_EmitCocoaMouseEvent(event,handle);
- }
- static int EmitKeyEvent(NSEvent *event,void *handle){
- return maxgui_cocoamaxgui_EmitCocoaKeyEvent(event,handle);
- }
- static void PostGuiEvent(int ev,void *handle,int data,int mods,int x,int y,BBObject *extra){
- if (extra==0) extra=&bbNullObject;
- maxgui_cocoamaxgui_PostCocoaGuiEvent(ev,handle,data,mods,x,y,extra);
- }
- static int filterKeyDownEvent(NSEvent *event,id source){
- int i,sz,res,key,mods;
- NSString *ch;
- key=bbSystemTranslateKey([event keyCode]);
- mods=bbSystemTranslateMods([event modifierFlags]);
- res=maxgui_cocoamaxgui_FilterKeyDown(source,key,mods);
- if (res==0) return 0;
- ch=[event characters];
- sz=[ch length];
- for(i=0;i<sz;++i){
- key=[ch characterAtIndex:i];
- switch(key){
- case 3:key=13;break; //Brucey's numberpad enter-key hack
- case 127:key=8;break;
- case 63272:key=127;break;
- }
- res=maxgui_cocoamaxgui_FilterChar(source,key,mods);
- if (res==0) return 0;
- }
- return 1;
- }
- void NSRelease(NSObject *obj){[obj release];}
- typedef struct nsgadget nsgadget;
- struct nsgadget{
- // BBObject
- BBClass *clas;
- int refs;
- // gadget
- BBObject *target;
- nsgadget *group;
- BBObject *kidlist;
- int x,y,w,h;
- BBString *textarg;
- void *extra;
- int style,sensitivity;
- int visible,total;
- int lockl,lockr,lockt,lockb;
- int lockx,locky,lockw,lockh,lockcw,lockch;
- void *filter,*context;
- void *items;
- int *arrPrevSelection;
- BBObject *datasource;
- void *datakeys;//$[]
- // nsGadget
- int internalclass,origclass;
- id handle;
- NSView *view;
- NSColor *textcolor;
- int intFontStyle;
- };
- // prototypes
- void NSSetSelection(nsgadget *gadget,int pos,int length,int units);
- void NSClearItems(nsgadget *gadget);
- @class CocoaApp;
- @class FlippedView;
- @class PanelView;
- @class CanvasView;
- @class ListView;
- @class TreeView;
- @class NodeItem;
- @class TextView;
- @class TabView;
- @class WindowView;
- @class ImageString;
- @class TableView;
- @class ToolView;
- @class Scroller;
- @interface CocoaApp:NSObject{
- NSMutableDictionary *toolbaritems;
- NSMutableArray *menuitems;
- }
- -(id)init;
- +(void)delayedGadgetAction:(NSNotification*)n;
- +(void)dispatchGuiEvents;
- -(BOOL)windowShouldClose:(id)sender;
- -(void)windowDidResize:(NSNotification *)aNotification;
- -(void)windowDidMove:(NSNotification *)aNotification;
- -(BOOL)windowShouldZoom:(NSWindow *)sender toFrame:(NSRect)newFrame;
- -(void)windowDidBecomeKey:(NSNotification *)aNotification;
- -(void)menuSelect:(id)sender;
- -(void)iconSelect:(id)sender;
- -(void)sliderSelect:(id)sender;
- -(void)scrollerSelect:(id)sender;
- -(void)buttonPush:(id)sender;
- -(void)textEdit:(id)sender;
- -(void)comboBoxSelectionDidChange:(NSNotification *)notification;
- -(void)addToolbarItem:(NSToolbarItem *)item;
- -(NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag;
- -(NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar;
- -(NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar;
- -(BOOL)validateToolbarItem:(NSToolbarItem *)theItem;
- -(void)addMenuItem:(NSMenuItem *)item;
- -(void)removeMenuItem:(NSMenuItem *)item;
- @end
- void ScheduleEventDispatch(){
- [CocoaApp performSelector:@selector(dispatchGuiEvents) withObject:nil afterDelay:0.0];
- }
- @interface Scroller:NSScroller{
- }
- -(id)init;
- //-(id)initWithFrame:(NSRect)rect;
- //-(void)drawParts;
- //-(void)drawKnob;
- //-(void)drawKnobSlotInRect:(NSRect)slotRect highlight:(BOOL)flag;
- //-(void)drawArrow:(NSScrollerArrow)arrow highlight:(BOOL)flag;
- //-(void)highlight:(BOOL)flag;
- @end
- @interface FlippedView:NSView{
- }
- -(BOOL)isFlipped;
- -(BOOL)mouseDownCanMoveWindow;
- @end
- @interface PanelView:NSBox{
- int style;
- int enabled;
- nsgadget *gadget;
- }
- -(BOOL)isFlipped;
- -(BOOL)mouseDownCanMoveWindow;
- -(void)setColor:(NSColor*)rgb;
- -(void)setAlpha:(float)alpha;
- -(void)setGadget:(nsgadget*)_gadget;
- -(void)setStyle:(int)s;
- -(void)setImage:(NSImage *)image withFlags:(int)flags;
- -(BOOL)acceptsFirstResponder;
- -(BOOL)becomeFirstResponder;
- -(void)setEnabled:(BOOL)flag;
- -(BOOL)isEnabled;
- @end
- @interface PanelViewContent:NSView{
- NSColor *color;
- NSImage *image;
- int imageflags;
- float alpha;
- }
- -(BOOL)isFlipped;
- -(BOOL)mouseDownCanMoveWindow;
- -(void)setColor:(NSColor*)rgb;
- -(void)setAlpha:(float)alpha;
- -(void)setImage:(NSImage *)image withFlags:(int)flags;
- -(void)drawRect:(NSRect)rect;
- @end
- @interface CanvasView:PanelView{
- }
- -(void)drawRect:(NSRect)rect;
- -(BOOL)acceptsFirstResponder;
- -(BOOL)becomeFirstResponder;
- @end
- @interface ListView:NSScrollView{
- TableView *table;
- NSTableColumn *column;
- NSBrowserCell *cell;
- NSMutableArray *items;
- NSDictionary *textstyle;
- }
- -(id)initWithFrame:(NSRect)rect;
- -(id)table;
- -(id)items;
- -(void)removeItemAtIndex:(int)index;
- -(void)setColor:(NSColor*)color;
- -(void)setTextColor:(NSColor*)color;
- -(int)numberOfRowsInTableView:(NSTableView *)aTableView;
- -(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
- -(BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex;
- -(void)clear;
- -(void)addItem:(NSString*)text atIndex:(unsigned)index withImage:(NSImage*)image withTip:(NSString*)tip withExtra:(BBObject*)extra;
- -(void)setItem:(NSString*)text atIndex:(unsigned)index withImage:(NSImage*)image withTip:(NSString*)tip withExtra:(BBObject*)extra;
- -(void)selectItem:(unsigned)index;
- -(void)deselectItem:(unsigned)index;
- -(void)tableViewSelectionDidChange:(NSNotification *)aNotification;
- -(void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
- -(void)setEnabled:(BOOL)flag;
- -(BOOL)isEnabled;
- -(void)updateWidthForString:(ImageString *) string;
- -(void)updateWidth;
- -(void)queueWidthUpdate;
- -(void)dealloc;
- -(void)setFont:(NSFont*)font;
- -(NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)data;
- @end
- @interface TableView:NSTableView{
- }
- -(NSMenu*)menuForEvent:(NSEvent *)theEvent;
- @end
- @interface OutlineView:NSOutlineView{
- }
- -(NSMenu*)menuForEvent:(NSEvent *)theEvent;
- @end
- @interface NodeItem:NSObject{
- TreeView *owner;
- NodeItem *parent;
- NSMutableArray *kids;
- NSString *title;
- NSImage *icon;
- }
- -(void)dealloc;
- -(id)initWithTitle:(NSString*)text;
- -(void)updateWidth;
- -(void)setOwner:(TreeView*)treeview;
- -(id)getOwner;
- -(void)show;
- -(void)attach:(NodeItem*)parent_ atIndex:(unsigned)index_;
- -(void)remove;
- -(BOOL)canExpand;
- -(NSMutableArray*)kids;
- -(NSString *)value;
- -(NSImage *)icon;
- -(void)setTitle:(NSString*)text;
- -(void)setIcon:(NSImage*)image;
- -(unsigned)count;
- @end
- @interface TreeView:NSScrollView{
- @public
- NSOutlineView *outline;
- NSTableColumn *column,*colin;
- NSBrowserCell *cell;
- NodeItem *rootNode;
- NSDictionary *textstyle;
- }
- -(id)initWithFrame:(NSRect)rect;
- -(void)reloadItem:(id)item;
- -(void)refresh;
- -(int)outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(id)item;
- -(id)outlineView:(NSOutlineView*)outlineView child:(int)index ofItem:(id)item;
- -(BOOL)outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item;
- -(id)outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(NSTableColumn*)tableColumn byItem:(id)item;
- -(unsigned)count;
- -(id)rootNode;
- -(id)selectedNode;
- -(void)selectNode:(id)node;
- -(void)expandNode:(id)node;
- -(void)collapseNode:(id)node;
- -(void)outlineViewItemDidExpand:(NSNotification *)notification;
- -(void)outlineViewItemDidCollapse:(NSNotification *)notification;
- -(void)outlineViewSelectionDidChange:(NSNotification *)notification;
- -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item;
- -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)dcell forTableColumn:(NSTableColumn *)tableColumn item:(id)item;
- -(void)setColor:(NSColor*)color;
- -(void)setTextColor:(NSColor*)color;
- -(void)setFont:(NSFont*)font;
- -(void)setEnabled:(BOOL)e;
- -(BOOL)isEnabled;
- -(void)dealloc;
- @end
- @interface TextView:NSTextView{
- NSScrollView *scroll;
- NSMutableParagraphStyle *style;
- NSMutableDictionary *styles;
- @public
- NSTextStorage *storage;
- int lockedNest;
- NSRange lockedRange;
- }
- -(NSSize)contentSize;
- -(id)storage;
- -(id)initWithFrame:(NSRect)rect;
- -(id)getScroll;
- -(void)setHidden:(BOOL)flag;
- -(void)setWordWrap:(BOOL)flag;
- -(void)setTabs:(int)tabs;
- -(void)setMargins:(int)leftmargin;
- -(void)setText:(NSString*)text;
- -(void)addText:(NSString*)text;
- -(void)setScrollFrame:(NSRect)rect;
- -(void)setTextColor:(NSColor*)color;
- -(void)setColor:(NSColor*)color;
- -(void)setFont:(NSFont*)font;
- -(NSMenu *)menuForEvent:(NSEvent*)theEvent;
- -(void)textDidChange:(NSNotification*)aNotification;
- -(void)textDidEndEditing:(NSNotification*)aNotification;
- -(void)textViewDidChangeSelection:(NSNotification *)aNotification;
- -(void)textStorageDidProcessEditing:(NSNotification *)aNotification;
- -(void)textStorageWillProcessEditing:(NSNotification *)aNotification;
- -(void)updateDragTypeRegistration;
- -(NSArray *)acceptableDragTypes;
- -(void)free;
- @end
- @interface TabView:NSTabView{
- id client;
- int update;
- int dragtype;
- int registration;
- int user;
- }
- -(id)initWithFrame:(NSRect)rect;
- -(id)clientView;
- -(void)setFrame:(NSRect)frameRect;
- -(void)selectTabViewItemAtIndex:(int)index;
- -(BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem;
- -(void)dealloc;
- @end
- @interface WindowView:NSWindow{
- id view;
- id label[3];
- nsgadget *gadget;
- int enabled;
- int zooming;
- NSView *dragging;
- }
- -(id)textFirstResponder;
- -(id)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)backing defer:(BOOL)flag withGadget:(nsgadget*)_gadget;
- -(id)clientView;
- -(void)setStatus:(NSString*)text align:(int)pos;
- -(void)sendEvent:(NSEvent*)event;
- -(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
- -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender;
- -(void)didResize;
- -(void)didMove;
- -(void)zoom;
- -(NSRect)localRect;
- -(BOOL)canBecomeKeyWindow;
- -(BOOL)canBecomeMainWindow;
- -(BOOL)becomeFirstResponder;
- -(void)setEnabled:(BOOL)flag;
- -(BOOL)isEnabled;
- -(void)dealloc;
- @end
- @interface ToolView:NSPanel{
- id view;
- id label[3];
- nsgadget *gadget;
- int enabled;
- int zooming;
- NSView *dragging;
- }
- -(id)textFirstResponder;
- -(id)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)backing defer:(BOOL)flag withGadget:(nsgadget*)_gadget;
- -(id)clientView;
- -(void)setStatus:(NSString*)text align:(int)pos;
- -(void)sendEvent:(NSEvent*)event;
- -(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
- -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender;
- -(void)didResize;
- -(void)didMove;
- -(void)zoom;
- -(NSRect)localRect;
- -(BOOL)canBecomeKeyWindow;
- -(BOOL)canBecomeMainWindow;
- -(BOOL)becomeFirstResponder;
- -(void)setEnabled:(BOOL)flag;
- -(BOOL)isEnabled;
- -(void)dealloc;
- @end
- static CocoaApp *GlobalApp;
- @class HTMLView;
- @interface HTMLView:WebView{
- int _state,_style;
- }
- -(id)initWithFrame:(NSRect)rect;
- -(int)loaded;
- -(void)setStyle:(int)style;
- -(void)setAddress:(NSString*)address;
- -(NSString*)address;
- @end
- @implementation HTMLView
- -(id)initWithFrame:(NSRect)rect{
- self=[super initWithFrame:rect];
- [self setAutoresizingMask:NSViewNotSizable];
- [self setPolicyDelegate:self];
- [self setFrameLoadDelegate:self];
- [self setUIDelegate:self];
- [self unregisterDraggedTypes];
- _state=0;
- return self;
- }
- -(int)loaded{
- return _state;
- }
- -(void)setStyle:(int)style{
- _style=style;
- }
- -(NSString*)address{
- WebDataSource *datasource;
- datasource=[[self mainFrame] provisionalDataSource];
- if(datasource==nil) datasource=[[self mainFrame] dataSource];
- if(datasource==nil) return [[NSString alloc] initWithString:@""];
- return [[[datasource request] URL] absoluteString];
- }
- -(void)setAddress:(NSString*)address{
- NSURL *url;
- NSURLRequest *request;
- WebFrame *frame;
-
- url=[NSURL URLWithString:address];
- if (url==nil) url=[NSURL fileURLWithPath:address];
- if (url==nil) return;
- _state=1;
- request=[NSURLRequest requestWithURL:url];
- frame=[self mainFrame];
- [frame loadRequest:request];
- }
- - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame{
- int oldstate=_state;
- NSURLRequest *url;
- BBString*text;
-
- _state=0;
-
- url=[[frame dataSource]initialRequest];
- text=bbStringFromCString((char*)[[[url URL] relativePath] cString]);
-
- if(oldstate)
- PostGuiEvent(BBEVENT_GADGETDONE,sender,0,0,0,0,(BBObject*)text);
- }
- - (void)webView:(WebView *)sender didChangeLocationWithinPageForFrame:(WebFrame *)frame{
- int oldstate=_state;
- NSURLRequest *url;
- BBString*text;
- _state=0;
- url=[[frame dataSource]initialRequest];
- text=bbStringFromCString((char*)[[[url URL] relativePath] cString]);
- if(oldstate)
- PostGuiEvent(BBEVENT_GADGETDONE,sender,0,0,0,0,(BBObject*)text);
- }
- - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)url frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener{
- BBString*text;
- int key;
- key=(int)[[actionInformation objectForKey:WebActionNavigationTypeKey] intValue];
- switch (key){
- case WebNavigationTypeOther:
- case WebNavigationTypeLinkClicked:
- if ((_state==0) && (_style & HTMLVIEW_NONAVIGATE)) {
- [listener ignore];
- text=bbStringFromCString((char*)[[[url URL] absoluteString] cString]);
- PostGuiEvent(BBEVENT_GADGETACTION,sender,0,0,0,0,(BBObject*)text);
- }else{
- [listener use];
- }
- default:
- [listener use];
- }
- }
- - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems{
- if(_style&HTMLVIEW_NOCONTEXTMENU)
- return [NSArray array];
- else
- return defaultMenuItems;
- }
- @end
- //Toolbar
- @class Toolbar;
- @interface Toolbar:NSToolbar{
- NSMutableDictionary *dictionary;
- NSMutableArray *items;
- }
- -(id)initWithIdentifier:(NSString *)string;
- -(void)setToolbarItem:(NSToolbarItem *)item atIndex:(int)index;
- -(void)setSeparatorAtIndex:(int)index;
- -(NSArray *)toolbarAllowedItemIdentifiers;
- -(NSArray *)toolbarDefaultItemIdentifiers;
- @end
- @implementation Toolbar
- -(id)initWithIdentifier:(NSString *)string{
- self=[super initWithIdentifier:string];
- dictionary=[[NSMutableDictionary dictionaryWithCapacity:10] retain];
- items=[[[NSMutableArray alloc] initWithCapacity:10] retain];
- return self;
- }
- -(void)setToolbarItem:(NSToolbarItem *)item atIndex:(int)index{
- [items insertObject:item atIndex:(NSUInteger)index];
- [dictionary setObject:item forKey:[item itemIdentifier]];
- }
- -(void)setSeparatorAtIndex:(int)index{
- static NSToolbarItem *NullItem=nil;
- if(NullItem==nil){
- NullItem=[[NSToolbarItem alloc] retain];
- }
- [items insertObject:NullItem atIndex:(NSUInteger)index];
- }
- -(NSArray *)toolbarAllowedItemIdentifiers{
- return [dictionary allValues];
- }
- -(NSArray *)toolbarDefaultItemIdentifiers{
- return [dictionary allValues];
- }
- @end
- // CocoaApp
- @implementation CocoaApp
- +(void)dispatchGuiEvents{
- maxgui_maxgui_DispatchGuiEvents();
- }
- +(void)delayedGadgetAction:(NSObject*)o{ // See controlTextDidChange
- PostGuiEvent(BBEVENT_GADGETACTION,
- o,
- [o respondsToSelector:@selector(indexOfSelectedItem)] ? [o indexOfSelectedItem] : 0,
- 0,0,0,0);
- }
- -(void)controlTextDidEndEditing:(NSNotification*)n{
- PostGuiEvent(BBEVENT_GADGETLOSTFOCUS,[n object],0,0,0,0,0);
- }
- -(void)controlTextDidChange:(NSNotification*)n{
- NSObject *o=[n object];
- [CocoaApp performSelector:@selector(delayedGadgetAction:) withObject:o afterDelay:0.0];
- }
- -(id)init{
- toolbaritems=[[NSMutableDictionary dictionaryWithCapacity:10] retain];
- menuitems=[[NSMutableArray arrayWithCapacity:10] retain];
- return self;
- }
- -(BOOL)windowShouldClose:(id)sender{
- PostGuiEvent(BBEVENT_WINDOWCLOSE,sender,0,0,0,0,0);
- return NO;
- }
- -(void)windowDidResize:(NSNotification *)aNotification{
- WindowView *window;
- ToolView * panel;
- if ([[aNotification object] isKindOfClass:[WindowView class]]) {
- window=(WindowView*)[aNotification object];
- [window didResize];
- } else {
- panel =(ToolView*)[aNotification object];
- [panel didResize];
- }
- }
- -(void)windowDidMove:(NSNotification *)aNotification{
- WindowView *window;
- ToolView * panel;
- if ([[aNotification object] isKindOfClass:[WindowView class]]) {
- window=(WindowView*)[aNotification object];
- [window didMove];
- } else {
- panel =(ToolView*)[aNotification object];
- [panel didMove];
- }
- }
- -(BOOL)windowShouldZoom:(NSWindow *)sender toFrame:(NSRect)newFrame{
- [(WindowView*)sender zoom];
- return YES;
- }
- -(void)windowDidBecomeKey:(NSNotification *)aNotification{
- NSWindow *window;
- window=(NSWindow*)[aNotification object];
- PostGuiEvent(BBEVENT_WINDOWACTIVATE,window,0,0,0,0,0);
- }
- -(void)menuSelect:(id)sender{
- PostGuiEvent(BBEVENT_MENUACTION,sender,[sender tag],0,0,0,0);
- }
- -(void)iconSelect:(id)sender{
- Toolbar *toolbar;
- int index;
- toolbar=[sender toolbar];
- index=[[toolbar items] indexOfObject:sender];
- PostGuiEvent(BBEVENT_GADGETACTION,toolbar,index,0,0,0,0);
- }
- -(void)sliderSelect:(id)sender{
- PostGuiEvent(BBEVENT_GADGETACTION,sender,0,0,0,0,0);
- }
- -(void)scrollerSelect:(id)sender{
- NSScroller *scroller;
- int delta=0;
- scroller=(NSScroller *)sender;
- switch([scroller hitPart]){
- case NSScrollerDecrementLine:
- delta=-1;
- break;
- case NSScrollerDecrementPage:
- delta=-2;
- break;
- case NSScrollerIncrementLine:
- delta=1;
- break;
- case NSScrollerIncrementPage:
- delta=2;
- break;
- }
- PostGuiEvent(BBEVENT_GADGETACTION,sender,delta,0,0,0,0);
- }
- -(void)buttonPush:(id)sender{
- if([sender allowsMixedState]) [sender setAllowsMixedState:NO];
- PostGuiEvent(BBEVENT_GADGETACTION,sender,0,0,0,0,0);
- }
- -(void)textEdit:(id)sender{
- PostGuiEvent(BBEVENT_GADGETACTION,sender,0,0,0,0,0);
- }
- -(void)comboBoxSelectionDidChange:(NSNotification *)notification{
- NSControl *o=(NSComboBox*)[notification object];
- [CocoaApp performSelector:@selector(delayedGadgetAction:) withObject:o afterDelay:0.0];
- }
- -(void)comboBoxSelectionIsChanging:(NSNotification *)notification{
-
- }
- -(void)comboBoxWillPopUp:(NSNotification *)notification{
- HaltMouseEvents=1;
- }
- -(void)comboBoxWillDismiss:(NSNotification *)notification{
- HaltMouseEvents=0;
- }
- -(void)addToolbarItem:(NSToolbarItem *)item{
- [toolbaritems setObject:item forKey:[item itemIdentifier]];
- }
- -(NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag{
- return [toolbaritems objectForKey:itemIdentifier];
- }
- -(NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar{
- Toolbar *mytoolbar=(Toolbar*)toolbar;
- return [mytoolbar toolbarAllowedItemIdentifiers];
- }
- -(NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar{
- Toolbar *mytoolbar=(Toolbar*)toolbar;
- return [mytoolbar toolbarDefaultItemIdentifiers];
- }
- -(BOOL)validateToolbarItem:(NSToolbarItem *)item{
- return [item isEnabled];
- }
- -(void)addMenuItem:(NSMenuItem *)item{
- [menuitems addObject:item];
- }
- -(void)removeMenuItem:(NSMenuItem *)item{
- [menuitems removeObject:item];
- }
- @end
- // Scroller
- @implementation Scroller
- -(id)init{
- [super init];
- [self setAlphaValue:.5f];
- return self;
- }
- //-(void)drawKnob{}
- //-(void)drawParts{}
- //-(void)drawKnobSlotInRect:(NSRect)slotRect highlight:(BOOL)flag{}
- //-(void)drawArrow:(NSScrollerArrow)arrow highlight:(BOOL)flag{}
- //-(void)highlight:(BOOL)flag{}
- @end
- // FlippedView
- @implementation FlippedView
- -(BOOL)isFlipped{
- return YES;
- }
- -(BOOL)mouseDownCanMoveWindow{
- return YES;
- }
- @end
- // PanelView
- @implementation PanelView
- - (BOOL)acceptsFirstResponder{
- return YES;
- }
- -(BOOL)becomeFirstResponder{
- return [self isEnabled];
- }
- -(void)setColor:(NSColor *)rgb{
- [[self contentView] setColor:rgb];
- }
- -(void)setAlpha:(float)al{
- [[self contentView] setAlpha:al];
- }
- -(void)setImage:(NSImage *)img withFlags:(int)flags{
- [[self contentView] setImage:img withFlags:flags];
- }
- -(void)setEnabled:(BOOL)e{
- enabled=e;
- }
- -(BOOL)isEnabled{
- return (enabled)?YES:NO;
- }
- -(void)setStyle:(int)s{
-
- gadget->sensitivity |= (s & PANEL_ACTIVE) ? (SENSITIZE_MOUSE|SENSITIZE_KEYS) : 0;
-
- switch (s & (PANEL_SUNKEN|PANEL_RAISED|PANEL_GROUP)){
- case PANEL_GROUP:
- [self setContentViewMargins: NSMakeSize(4.0,4.0)];
- [self setBoxType:NSBoxPrimary];
- [self setBorderType: NSBezelBorder];
- [self setTitlePosition: NSAtTop];
- break;
- case PANEL_RAISED:
- case PANEL_SUNKEN:
- [self setContentViewMargins: NSMakeSize(0.0,0.0)];
- [self setBoxType: NSBoxOldStyle];
- [self setBorderType: NSLineBorder];
- [self setTitlePosition: NSNoTitle];
- break;
- default:
- [self setContentViewMargins: NSMakeSize(0.0,0.0)];
- [self setBorderType: NSNoBorder];
- [self setTitlePosition: NSNoTitle];
- }
-
- style=s;
- }
- -(void)setGadget:(nsgadget*)_gadget{
- gadget=_gadget;
- }
- -(BOOL)mouseDownCanMoveWindow{
- return NO;
- }
- @end
- //PanelViewContent
- @implementation PanelViewContent
- -(BOOL)isFlipped{
- return YES;
- }
- -(BOOL)mouseDownCanMoveWindow{
- return NO;
- }
- -(void)setColor:(NSColor *)rgb{
- if (color){
- [color release];
- color=0;
- }
- if(rgb){
- color=[rgb colorWithAlphaComponent:1.0];
- [color retain];
- }
- [self setNeedsDisplay:YES];
- }
- -(void)setImage:(NSImage *)img withFlags:(int)flags{
- if (img) [img retain];
- if (image) [image release];
- image=img;
- imageflags=flags;
- [self setNeedsDisplay:YES];
- }
- -(void)setAlpha:(float)al{
- alpha=al;
- if (color){
- [color release];
- color=[color colorWithAlphaComponent:alpha];
- [color retain];
- }
- [self setNeedsDisplay:YES];
- }
- -(void)drawRect:(NSRect)rect{
-
- NSRect dest=NSUnionRect(rect,[self frame]);
-
- if (color){
- [color set];
- if (alpha<1.0)
- NSRectFillUsingOperation(dest,NSCompositeSourceOver);
- else
- NSRectFill(dest);
- }
-
- if (image){
- int op,x,y,w,h;
- float a;
- float m,mm;
- NSRect src,tile;
- a=alpha;
- op=NSCompositeSourceOver;
- src.origin.x=0;
- src.origin.y=0;
- src.size=[image size];
- [image setFlipped:YES];
- switch (imageflags&(GADGETPIXMAP_ICON-1)){
- case PANELPIXMAP_TILE:
- tile.size=[image size];
- for (y=0;y<dest.size.height;y+=src.size.height){
- tile.origin.y=y;
- for (x=0;x<dest.size.width;x+=src.size.width){
- tile.origin.x=x;
- [image drawInRect:tile fromRect:src operation:op fraction:a];
- }
- }
- break;
- case PANELPIXMAP_CENTER:
- dest.origin.x=(dest.size.width-src.size.width)/2;
- dest.origin.y=(dest.size.height-src.size.height)/2;
- dest.size=src.size;
- [image drawInRect:dest fromRect:src operation:op fraction:a];
- break;
- case PANELPIXMAP_FIT:
- m=dest.size.width/src.size.width;
- mm=dest.size.height/src.size.height;
- if (m>mm) m=mm;
- dest.origin.x+=(dest.size.width-src.size.width*m)/2;
- dest.origin.y+=(dest.size.height-src.size.height*m)/2;
- dest.size.width=src.size.width*m;
- dest.size.height=src.size.height*m;
- [image drawInRect:dest fromRect:src operation:op fraction:a];
- break;
- case PANELPIXMAP_STRETCH:
- [image drawInRect:dest fromRect:src operation:op fraction:a];
- break;
- case PANELPIXMAP_FIT2:
- m=dest.size.width/dest.size.height;
-
- if ((dest.size.width/src.size.width)<(dest.size.height/src.size.height)){
- src.origin.x=(src.size.width-(src.size.height*m))/2;
- src.size.width=src.size.height*m;
- } else {
- src.origin.y=(src.size.height-(src.size.width/m))/2;
- src.size.height=src.size.width/m;
- }
-
- [image drawInRect:dest fromRect:src operation:op fraction:a];
- break;
- }
- [image setFlipped:NO];
- }
-
- [super drawRect:rect];
- }
- @end
- // CanvasView
- @implementation CanvasView
- -(void)drawRect:(NSRect)rect{
- [super drawRect:rect];
- PostGuiEvent(BBEVENT_GADGETPAINT,self,0,0,0,0,0);
- }
- - (BOOL)acceptsFirstResponder{
- return YES;
- }
- -(BOOL)becomeFirstResponder{
- return [self isEnabled];
- }
- @end
- // ImageString
- @class ImageString;
- @interface ImageString:NSObject{
- NSString *_string;
- NSImage *_image;
- NSString *_tip;
- BBObject *_extra;
- }
- -(id)initWithString:(NSString *)text image:(NSImage *)image tip:(NSString *)tip extra:(BBObject*)extra;
- -(void)dealloc;
- -(id)copyWithZone:(NSZone *)zone;
- -(NSString*)string;
- -(NSImage*)image;
- -(NSString*)description;
- -(BBObject*)extra;
- @end
- @implementation ImageString
- -(id)initWithString:(NSString *)string image:(NSImage *)image tip:(NSString*)tip extra:(BBObject*)extra{
- _string=string;
- _image=image;
- _tip=tip;
- _extra=extra;
- if (string) [string retain];
- if (image) [image retain];
- if (tip) [tip retain];
- return self;
- }
- -(void)dealloc{
- if (_string) [_string release];
- if (_image) [_image release];
- if (_tip) [_tip release];
- [super dealloc];
- }
- -(id)copyWithZone:(NSZone *)zone{
- ImageString *copy=[[[self class] allocWithZone:zone] initWithString:_string image:_image tip:_tip extra:_extra];
- return copy;
- }
- -(NSString*)string{return _string;}
- -(NSImage*)image{return _image;}
- -(NSString*)description{return _tip;}
- -(BBObject*)extra{return _extra;}
- @end
- // ListView
- @implementation ListView
- -(id)initWithFrame:(NSRect)rect{
- [super initWithFrame:rect];
- [self setBorderType:NSNoBorder];
- [self setHasVerticalScroller:YES];
- [self setHasHorizontalScroller:YES];
- [self setAutohidesScrollers:YES];
- column=[[NSTableColumn alloc] init];
- cell=[[NSBrowserCell alloc] init];
- [cell setLeaf:YES];
- [column setDataCell:cell];
- NSSize contentSize=[self contentSize];
- table=[[TableView alloc] initWithFrame:NSMakeRect(0,0,contentSize.width,contentSize.height)];
- [table setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
- items=[[NSMutableArray alloc] initWithCapacity:10];
- [table setHeaderView:nil];
- [table setDataSource:self];
- [table setDelegate:self];
- [self setDocumentView:table];
- [table addTableColumn:column];
- [table sizeLastColumnToFit];
- return self;
- }
- -(id)table{
- return table;
- }
- -(id)items{
- return items;
- }
- -(void)removeItemAtIndex:(int)index{
- ImageString *item=(ImageString*)[items objectAtIndex:index];
- [items removeObjectAtIndex:index];
- [item release];
- [table reloadData];
- [self queueWidthUpdate];
- }
- -(void)setColor:(NSColor*)color{
- [table setBackgroundColor:color];
- }
- -(void)setEnabled:(BOOL)e{
- [table setEnabled:e];
- }
- -(BOOL)isEnabled{
- return [table isEnabled];
- }
- -(void)setTextColor:(NSColor*)color{
- if (textstyle) {[textstyle release];textstyle=nil;}
- if (color){
- textstyle=[NSDictionary dictionaryWithObjectsAndKeys:color,NSForegroundColorAttributeName,nil];
- [textstyle retain];
- }
- }
- -(int)numberOfRowsInTableView:(NSTableView *)aTableView{
- return [items count];
- }
- -(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{
- return [items objectAtIndex:rowIndex];
- }
- -(BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex{ /*new from BAH*/
- PostGuiEvent(BBEVENT_GADGETACTION,self,rowIndex,0,0,0,0);
- return NO;
- }
- -(void)clear{
- [table setDelegate:nil];
- ImageString *item;
- int count,i;
- count=[items count];
- for (i=0;i<count;i++){
- item=(ImageString*)[items objectAtIndex:i];
- [item release];
- }
- [items removeAllObjects];
- [table reloadData];
- [table setDelegate:self];
- [self queueWidthUpdate];
- }
- -(void)addItem:(NSString*)text atIndex:(unsigned)index withImage:(NSImage*)image withTip:(NSString*)tip withExtra:(BBObject*)extra{
- ImageString *item;
- item=[[ImageString alloc] initWithString:text image:image tip:tip extra:extra];
- [items insertObject:item atIndex:index];
- [self updateWidthForString:item];
- [table noteNumberOfRowsChanged];
- }
- -(void)setItem:(NSString*)text atIndex:(unsigned)index withImage:(NSImage*)image withTip:(NSString*)tip withExtra:(BBObject*)extra{
- ImageString *item;
- item=(ImageString*)[items objectAtIndex:index];
- [item release];
- item=[[ImageString alloc] initWithString:text image:image tip:tip extra:extra];
- [items replaceObjectAtIndex:index withObject:item];
- [table reloadData];
- [self queueWidthUpdate];
- }
- -(void)selectItem:(unsigned)index{
- [table setDelegate:nil];
- [table selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO];
- [table setDelegate:self];
- }
- -(void)deselectItem:(unsigned)index{
- [table setDelegate:nil];
- [table deselectRow:index];
- [table setDelegate:self];
- }
- -(void)tableViewSelectionDidChange:(NSNotification *)aNotification{/*new from BAH*/
- int index=[table selectedRow];
- ImageString *item=nil;
- if (index>=0) item=(ImageString*)[items objectAtIndex:index]; else index=-1;
- if (item){
- PostGuiEvent(BBEVENT_GADGETSELECT,self,index,0,0,0,[item extra]);
- }else{
- PostGuiEvent(BBEVENT_GADGETSELECT,self,-1,0,0,0,&bbNullObject);
- }
- }
- -(void)tableView:(NSTableView *)table willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{
- NSString *text=[[items objectAtIndex:rowIndex] string];
- if (textstyle){
- NSAttributedString *atext=[[[NSAttributedString alloc] initWithString:text attributes:textstyle] autorelease];
- [aCell setAttributedStringValue:atext];
- }else{
- [aCell setStringValue:text];
- }
- [aCell setImage:[[items objectAtIndex:rowIndex] image]];
- }
- -(void)updateWidthForString:(ImageString *) imgstring{
-
- NSCell* dcell;
- float cellWidth;
-
- dcell=[column dataCell];
- [dcell setStringValue:[imgstring string]];
- [dcell setImage:[imgstring image]];
- cellWidth=((NSSize)[dcell cellSize]).width;
- if([column minWidth] < cellWidth){
- [column setMinWidth:cellWidth];
- [column setWidth:cellWidth];
- [table setNeedsDisplay:YES];
- }
-
- }
- -(void)updateWidth{
- int i,count;
- count=[items count];
- [column setMinWidth:0];
- for (i=0;i<count;i++)
- [self updateWidthForString:(ImageString*)[items objectAtIndex:i]];
- }
- -(void)queueWidthUpdate{
- [NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(updateWidth) object:nil];
- [self performSelector:@selector(updateWidth) withObject:nil afterDelay:0.0];
- }
- -(void)dealloc{
- ImageString *item;
- int count,i;
- count=[items count];
- for (i=0;i<count;i++){
- item=(ImageString*)[items objectAtIndex:i];
- [item release];
- }
- [table release];
- [column release];
- [cell release];
- [items release];
- if (textstyle) {
- [textstyle release];
- }
- [super dealloc];
- }
- -(void)setFont:(NSFont*)font{
- if (font) {
- [table setRowHeight:[font defaultLineHeightForFont]+2];
- [[column dataCell] setFont:font];
- [table reloadData];
- [self updateWidth];
- }
- }
- - (NSString *)tableView:(NSTableView *)aTableView toolTipForCell:(NSCell *)aCell rect:(NSRectPointer)rect
- tableColumn:(NSTableColumn *)aTableColumn row:(int)row mouseLocation:(NSPoint)mouseLocation{
-
- return [[items objectAtIndex:row] description];
- }
- @end
- // TableView
- @implementation TableView
- -(NSMenu*)menuForEvent:(NSEvent *)theEvent{
- int row=-1;
- NSPoint p=[self convertPoint:[theEvent locationInWindow] fromView:nil];
- row=[self rowAtPoint:p];
- if (row < [self numberOfRows]) {
- [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
- PostGuiEvent(BBEVENT_GADGETMENU,[self dataSource],row,0,0,0,0);
- }
- return nil;
- }
- @end
- // OutlineView
- @implementation OutlineView
- -(NSMenu*)menuForEvent:(NSEvent *)theEvent{
- id node;
- NSPoint p=[self convertPoint:[theEvent locationInWindow] fromView:nil];
- int i=[self rowAtPoint:p];
- if (i>-1 && i<[self numberOfRows]){
- node=[self itemAtRow:i];
- PostGuiEvent(BBEVENT_GADGETMENU,[self dataSource],(int)node,0,0,0,0); //[self superview]
- }
- return nil;
- }
- @end
- // TreeView
- @implementation TreeView
- -(id)initWithFrame:(NSRect)rect{
- [super initWithFrame:rect];
- [self setBorderType:NSNoBorder];
- [self setHasVerticalScroller:YES];
- [self setHasHorizontalScroller:YES];
- [self setAutohidesScrollers:YES];
- rootNode=[[NodeItem alloc] initWithTitle:@"root"];
- [rootNode setOwner:self];
- NSSize contentSize=[self contentSize];
- outline=[[OutlineView alloc] initWithFrame:NSMakeRect(0,0,contentSize.width,contentSize.height)];
- [outline setHeaderView:nil];
- [outline setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
- [outline setDataSource:self];
- [outline setDelegate:self];
- column=[[NSTableColumn alloc] init];
- [outline addTableColumn:column];
- [outline setOutlineTableColumn:column];
- cell=[[NSBrowserCell alloc] init];
- [cell setLeaf:YES];
- [cell setScrollable:YES];
- [column setDataCell:cell];
- [self setDocumentView:outline];
- [outline sizeLastColumnToFit];
- return self;
- }
- -(void)dealloc{
- [outline autorelease];
- [column autorelease];
- [cell autorelease];
- if (textstyle) {
- [textstyle release];
- }
- [super dealloc];
- }
- -(void)refresh{
- [rootNode updateWidth];
- [outline reloadData];
- }
- -(int)outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(id)item{
- if(!item) item=rootNode;
- return [[item kids] count];
- }
- -(id)outlineView:(NSOutlineView*)outlineView child:(int)index ofItem:(id)item{
- if(!item) item=rootNode;
- if (index>=[[item kids] count]) return 0;
- return [[item kids] objectAtIndex:index];
- }
- -(BOOL)outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item{
- if(!item) item=rootNode;
- return [item canExpand];
- }
- -(id)outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(NSTableColumn*)tableColumn byItem:(id)item{
- if (tableColumn==colin) return @"";
- if(!item) item=rootNode;
- return [item value];
- }
- -(unsigned)count{
- return [rootNode count];
- }
- -(id)rootNode{
- return rootNode;
- }
- -(id)selectedNode{
- int index;
- index=[outline selectedRow];
- if (index==-1) return nil;
- return [outline itemAtRow:index];
- }
- -(void)selectNode:(id)node{
- int index;
- [node show];
- [outline setDelegate:nil];
- index=[outline rowForItem:node];
- [outline selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO];
- [outline setDelegate:self];
- [outline scrollRowToVisible:index];
- }
- -(void)expandNode:(id)node{
- [outline setDelegate:nil];
- [outline expandItem:node];
- [outline tile];
- [outline setDelegate:self];
- [node queueWidthUpdate];
- }
- -(void)collapseNode:(id)node{
- [outline setDelegate:nil];
- [outline collapseItem:node];
- [outline tile];
- [outline setDelegate:self];
- [column setMinWidth:0];
- [rootNode queueWidthUpdate];
- }
- -(void)outlineViewItemDidExpand:(NSNotification *)notification{
- id node;
- node=[[notification userInfo] objectForKey:@"NSObject"];
- [node queueWidthUpdate];
- PostGuiEvent(BBEVENT_GADGETOPEN,self,(int)node,0,0,0,0);
- }
- -(void)outlineViewItemDidCollapse:(NSNotification *)notification{
- id node;
- node=[[notification userInfo] objectForKey:@"NSObject"];
- [column setMinWidth:0];
- [rootNode queueWidthUpdate];
- PostGuiEvent(BBEVENT_GADGETCLOSE,self,(int)node,0,0,0,0);
- }
- -(void)outlineViewSelectionDidChange:(NSNotification *)notification{
- id node;
- node=[self selectedNode];
- PostGuiEvent(BBEVENT_GADGETSELECT,self,(int)node,0,0,0,0);
- }
- -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item{
- PostGuiEvent(BBEVENT_GADGETACTION,self,(int)item,0,0,0,0);
- return NO;
- }
- -(void)setColor:(NSColor*)color{
- [outline setBackgroundColor:color];
- }
- -(void)setTextColor:(NSColor*)color{
- if (textstyle) {[textstyle release];textstyle=nil;}
- if (color){
- textstyle=[NSDictionary dictionaryWithObjectsAndKeys:color,NSForegroundColorAttributeName,nil];
- [textstyle retain];
- }
- }
- - (void)setFont:(NSFont*)font{
- if (font) {
- NSLayoutManager* layoutManager=[[[NSLayoutManager alloc] init] autorelease];
- int i;
- NSArray *columnsArray=[outline tableColumns];
- for (i= 0; i < [columnsArray count]; i++)
- [[[columnsArray objectAtIndex:i] dataCell] setFont:font];
- [outline setRowHeight: [layoutManager defaultLineHeightForFont:font]+1];
- [rootNode queueWidthUpdate];
- }
- }
- - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)dcell forTableColumn:(NSTableColumn *)tableColumn item:(id)node{
- if (textstyle){
- NSAttributedString *atext=[[[NSAttributedString alloc] initWithString:[node value] attributes:textstyle] autorelease];
- [dcell setAttributedStringValue:atext];
- }
- else{
- [dcell setStringValue:[node value]];
- }
- [dcell setImage:[node icon]];
- }
- -(void)setEnabled:(BOOL)e{
- [outline setEnabled:e];
- }
- -(BOOL)isEnabled{
- return [outline isEnabled];
- }
- @end
- // NodeItem
- @implementation NodeItem
- -(void)dealloc{}
- -(id)initWithTitle:(NSString*)text{
- owner=nil;
- parent=nil;
- title=text;
- icon=nil;
- [title retain];
- kids=[[NSMutableArray alloc] initWithCapacity:10];
- [kids retain];
- return self;
- }
- -(void)updateWidth{
- int i;
- float cellWidth;
- float indentationWidth;
-
- NSCell* dcell;
- NSArray* columnsArray;
-
- if(owner==nil) return;
-
- NSOutlineView* outline=owner->outline;
- NSTableColumn* tableColumn=owner->column;
-
- if(tableColumn!=nil){
- dcell=[tableColumn dataCell];
- [dcell setStringValue:title];
- [dcell setImage:icon];
- cellWidth=((NSSize)[dcell cellSize]).width;
- indentationWidth=[outline levelForItem: self];
- if(isnan(indentationWidth)) indentationWidth=0; else indentationWidth=([outline indentationPerLevel]*(indentationWidth+1));
- if((owner->rootNode == self) || [outline isItemExpanded:self])
- for (i= 0; i < [kids count]; i++) [[kids objectAtIndex:i] updateWidth];
- if([tableColumn minWidth] < (cellWidth+indentationWidth)){
- [tableColumn setMinWidth:(cellWidth+indentationWidth)];
- [tableColumn setWidth:(cellWidth+indentationWidth)];
- }
- }
- }
- -(void)queueWidthUpdate{
- [NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(updateWidth) object:nil];
- [self performSelector:@selector(updateWidth) withObject:nil afterDelay:0.0];
- }
- -(void)setOwner:(TreeView*)treeview{
- owner=treeview;
- }
- -(id)getOwner{
- return owner;
- }
- -(void)show{
- if (parent){
- [parent show];
- [owner expandNode:parent];
- }
- }
- -(void)attach:(NodeItem*)parent_ atIndex:(unsigned)index_{
- parent=parent_;
- if(parent){
- owner=parent->owner;
- [[parent kids] insertObject:self atIndex:index_];
- [self release];
- }
- if (owner) [owner refresh];
- }
- -(void)remove{
- if(parent) [[parent kids] removeObject:self];
- if (owner) [owner refresh];
- }
- -(BOOL)canExpand{
- return [kids count]>0;
- }
- -(NSMutableArray*)kids{
- return kids;
- }
- -(NSString *)value{return title;}
- -(NSImage *)icon{return icon;}
- -(void)setTitle:(NSString*)text{
- [title release];
- title=text;
- [title retain];
- if (owner){
- [owner->outline reloadItem:self];
- [owner->rootNode queueWidthUpdate];
- }
- }
- -(void)setIcon:(NSImage*)image{
- if (icon) [icon release];
- icon=image;
- if (icon) [icon retain];
- if (owner){
- [owner->outline reloadItem:self];
- [(icon ? self : owner->rootNode) queueWidthUpdate];
- }
- }
- -(unsigned)count{
- return [kids count];
- }
- @end
- // TextView
- @implementation TextView
- -(id)initWithFrame:(NSRect)rect{
-
- scroll=[[NSScrollView alloc] initWithFrame:rect];
- // [scroll setVerticalScroller:[[Scroller alloc] init]];
- // [scroll setHorizontalScroller:[[Scroller alloc] init]];
- [scroll setHasVerticalScroller:YES];
- [scroll setHasHorizontalScroller:YES];
- [scroll setDrawsBackground:NO];
- [scroll setRulersVisible:NO];
- [scroll setBorderType:NSNoBorder];
- [scroll setAutohidesScrollers:YES];
-
- NSSize contentSize=[scroll contentSize];
- self=[super initWithFrame:NSMakeRect(0,0,contentSize.width,contentSize.height)];
- [self setMinSize:NSMakeSize(contentSize.width,contentSize.height)];
- [self setMaxSize:NSMakeSize(FLT_MAX,FLT_MAX)];
- [self setVerticallyResizable:YES];
- [self setHorizontallyResizable:YES];
- [self setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
- [[self textContainer] setContainerSize:NSMakeSize(FLT_MAX,FLT_MAX)];
- [[self textContainer] setWidthTracksTextView:NO];
- [self setDelegate:self];
- [self setUsesRuler:NO];
- [scroll setDocumentView:self];
- style=[[NSParagraphStyle defaultParagraphStyle] mutableCopy];
- [style setLineBreakMode:NSLineBreakByClipping];
-
- styles=[NSMutableDictionary dictionaryWithObject:style forKey:NSParagraphStyleAttributeName];
- [styles retain];
- storage=[self textStorage];
- [storage setDelegate:self];
-
- lockedNest=0;
-
- [self setTabs: 4];
- if ([self respondsToSelector: @selector(setDefaultParagraphStyle)])
- [self setDefaultParagraphStyle: style];
-
- if ([self respondsToSelector: @selector(setAutomaticLinkDetectionEnabled)])
- [self setAutomaticLinkDetectionEnabled: NO];
- if ([self respondsToSelector: @selector(setAutomaticQuoteSubstitutionEnabled)])
- [self setAutomaticQuoteSubstitutionEnabled: NO];
- if ([self respondsToSelector: @selector(setAutomaticSpellingCorrectionEnabled)])
- [self setAutomaticSpellingCorrectionEnabled: NO];
- if ([self respondsToSelector: @selector(setAutomaticTextReplacementEnabled)])
- [self setAutomaticTextReplacementEnabled: NO];
- if ([self respondsToSelector: @selector(setAutomaticDataDetectionEnabled)])
- [self setAutomaticDataDetectionEnabled: NO];
-
- return self;
- }
- -(void)free{
- [scroll setDocumentView:nil];
- [scroll release];
- [style release];
- [styles release];
- [storage release];
- }
- -(void)setHidden:(BOOL)flag{
- [scroll setHidden:flag];
- }
- -(id)storage{
- return storage;
- }
- -(NSSize)contentSize{
- return [scroll contentSize];
- }
- -(id)getScroll{
- return scroll;
- }
- -(void)setWordWrap:(BOOL)flag{
- NSSize contentSize=[self contentSize];
- if (flag){
- [scroll setHasHorizontalScroller:NO];
- [self setHorizontallyResizable:NO];
- [self setAutoresizingMask:NSViewWidthSizable];
- [[self textContainer] setContainerSize:NSMakeSize(contentSize.width,FLT_MAX)];
- [[self textContainer] setWidthTracksTextView:YES];
- [style setLineBreakMode:NSLineBreakByWordWrapping];
- }
- else{
- [scroll setHasHorizontalScroller:YES];
- [self setHorizontallyResizable:YES];
- [self setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
- [[self textContainer] setContainerSize:NSMakeSize(FLT_MAX,FLT_MAX)];
- [[self textContainer] setWidthTracksTextView:NO];
- [style setLineBreakMode:NSLineBreakByClipping];
- }
- [storage addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0,[storage length])];
- }
- -(void)setTabs:(int)tabs{
- [style setTabStops:[NSArray array]]; //Clear any TabStops
- [style setDefaultTabInterval: tabs]; //Set recurring TabStops remembering to convert from twips->pixels
- [storage addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0,[storage length])];
- }
- -(void)setMargins:(int)leftmargin{
- [self setTextContainerInset:NSMakeSize(leftmargin,0) ];
- // [style setFirstLineHeadIndent: leftmargin*8];
- // [style setHeadIndent: leftmargin*8];
- // [storage addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0,[storage length])];
- }
- -(void)setText:(NSString*)text{
- NSAttributedString *astring;
- astring=[[NSAttributedString alloc] initWithString:text attributes:styles];
- if (lockedNest) [storage endEditing];
- [storage setAttributedString:astring];
- if (lockedNest) [storage beginEditing]; else [self setSelectedRange:NSMakeRange(0,0)];
- }
- -(void)addText:(NSString*)text{
- NSAttributedString *astring;
- astring=[[NSAttributedString alloc] initWithString:text attributes:styles];
- if (lockedNest) [storage endEditing];
- [storage appendAttributedString:astring];
- if (lockedNest) [storage beginEditing];
- }
- -(void)setScrollFrame:(NSRect)rect{
- [scroll setFrame:rect];
- }
- -(void)setTextColor:(NSColor*)color{
- [styles setObject:color forKey:NSForegroundColorAttributeName];
- [storage addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0,[storage length])];
- [self setInsertionPointColor:color];
- }
- -(void)setColor:(NSColor*)color{
- if(color){
- [self setBackgroundColor:color];
- [self setDrawsBackground:true];
- [scroll setBackgroundColor:color];
- [scroll setDrawsBackground:true];
- }else{
- [self setDrawsBackground:false];
- [scroll setDrawsBackground:false];
- }
- }
- -(void)setFont:(NSFont*)font{
- [styles setObject:font forKey:NSFontAttributeName];
- [storage setFont:font];
- [super setFont:font];
- }
- -(NSMenu *)menuForEvent:(NSEvent *)event{
- NSPoint p;
- int x,y;
- p=[event locationInWindow];
- x=(int)p.x;y=(int)p.y;
- PostGuiEvent(BBEVENT_GADGETMENU,self,0,0,x,y,0);
- return nil;
- }
- -(void)updateDragTypeRegistration{
- }
- -(NSArray *)acceptableDragTypes{
- return nil;
- }
- -(void)textDidBeginEditing:(NSNotification*)n{
- // printf("textDidBeginEditing:%p\n",_textEditor);fflush(stdout);
- }
- -(void)textDidChange:(NSNotification*)n{
- PostGuiEvent(BBEVENT_GADGETACTION,self,0,0,0,0,0);
- }
- -(void)textDidEndEditing:(NSNotification*)n{
- // printf("textDidEndEditing:%p\n",_textEditor);fflush(stdout);
- PostGuiEvent(BBEVENT_GADGETLOSTFOCUS,[n object],0,0,0,0,0);
- }
- -(void)textViewDidChangeSelection:(NSNotification *)aNotification{
- PostGuiEvent(BBEVENT_GADGETSELECT,self,0,0,0,0,0);
- }
- -(void)textStorageDidProcessEditing:(NSNotification *)aNotification{
- }
- -(void)textStorageWillProcessEditing:(NSNotification *)aNotification{
- [storage removeAttribute:NSLinkAttributeName range:[storage editedRange]];
- }
- @end
- // TabViewItem
- @class TabViewItem;
- @interface TabViewItem:NSTabViewItem{
- NSImage *_image;
- }
- -(id)initWithIdentifier:(NSString *)text;
- -(void)setImage:(NSImage*)image;
- -(id)copyWithZone:(NSZone *)zone;
- -(NSImage*)image;
- -(NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel;
- -(void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect;
- @end
- @implementation TabViewItem
- -(id)initWithIdentifier:(NSString *)string{
- self=[super initWithIdentifier:string];
- _image=nil;
- return self;
- }
- -(void)setImage:(NSImage*)image{
- _image=image;
- if (_image) [_image setScalesWhenResized:YES];
- }
- -(id)copyWithZone:(NSZone *)zone{
- TabViewItem *copy=[[[self class] allocWithZone:zone] initWithIdentifier:[self identifier]];
- return copy;
- }
- -(NSImage*)image{
- return _image;
- }
- -(NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel{
- NSSize size;
- NSSize imageDimensions;
- float ratio;
- size=[super sizeOfLabel:shouldTruncateLabel];
-
- if (_image) {
- imageDimensions=[_image size];
- if (imageDimensions.height > size.height){
- ratio=size.height/imageDimensions.height;
- imageDimensions.width*=ratio;imageDimensions.height*=ratio;
- [_image setSize: imageDimensions];
- }
- size.width += imageDimensions.height;
- }
- return size;
- }
- -(void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)content{
- NSSize imageDimensions;
- NSPoint point;
- if (_image){
- imageDimensions=[_image size];
- point=NSMakePoint(content.origin.x,content.origin.y+imageDimensions.height);
- [_image compositeToPoint:point operation:NSCompositeSourceOver];
- content.origin.x+=imageDimensions.width;content.size.width-=imageDimensions.width;
- }
- [super drawLabel:shouldTruncateLabel inRect:content];
- }
- @end
- // TabView
- @implementation TabView
- -(id)initWithFrame:(NSRect)rect{
- rect.size.height+=8;
- self=[super initWithFrame:rect];
- [super setControlSize:NSSmallControlSize];
- [super setFont:[NSFont labelFontOfSize:[NSFont smallSystemFontSize]]];
- client=[[FlippedView alloc] initWithFrame:[self contentRect]];
- [client setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
- [client retain];
- user=1;
- [self setDelegate:self];
- return self;
- }
- -(id)clientView{
- return client;
- }
- -(void)selectTabViewItemAtIndex:(int)index{
- user=0;
- [super selectTabViewItemAtIndex:index];
- user=1;
- }
- -(void)setFrame:(NSRect)rect{
- rect.size.height+=8;
- [super setFrame:rect];
- }
- -(BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem{
- int index;
- [tabViewItem setView:client];
- [client setFrame:[self contentRect]];
- if (user){
- index=[self indexOfTabViewItem:tabViewItem];
- PostGuiEvent(BBEVENT_GADGETACTION,self,index,0,0,0,0);
- }
- return YES;
- }
- -(void)dealloc{
- NSArray *items;
- int i,n;
-
- items=[self tabViewItems];
- n=[items count];
- for (i=0;i<n;i++) [self removeTabViewItem:[items objectAtIndex:0]];
- [client release];
- [super dealloc];
- }
- -(NSMenu *)menuForEvent:(NSEvent *)event{
- int index;
- NSTabViewItem* tabItem;
- tabItem=[self tabViewItemAtPoint:[self convertPoint:[event locationInWindow] fromView:nil]];
- if (tabItem) index=[self indexOfTabViewItem:tabItem]; else index=-1;
- PostGuiEvent(BBEVENT_GADGETMENU,self,index,0,0,0,0);
- return [super menuForEvent:event];
- }
- @end
- // WindowView
- @implementation WindowView
- -(id)textFirstResponder{
- id r=[self firstResponder];
- //if ([r isKindOfClass:[PanelView class]]) return r;
- if ([r isKindOfClass:[NSTextView class]]){
- id d=[r delegate];
- if([d isKindOfClass:[NSTextField class]]) return d;
- }
- return r;
- }
- -(id)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)backing defer:(BOOL)flag withGadget:(nsgadget*)_gadget{
- //withStatus:(BOOL)status{
- id client;
- int i;
- NSText *l;
- NSBox *box;
- dragging=nil;
- self=[super initWithContentRect:rect styleMask:mask backing:backing defer:flag];
- gadget=_gadget;
- view=[[FlippedView alloc] init];
- enabled=true;
- [self setContentView:view];
- [self setAcceptsMouseMovedEvents:YES];
- [self disableCursorRects]; //Fixes NSSetPointer not sticking.
- if (gadget->style&WINDOW_STATUS){
- rect.origin.x=rect.origin.y=0;
- rect.size.height-=STATUSBARHEIGHT;
- client=[[FlippedView alloc] initWithFrame:rect];
- [client setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
- [view addSubview:client];
- // label for window status
- rect.origin.y=rect.size.height+3;
- rect.size.height=STATUSBARHEIGHT-4;
- rect.size.width-=[NSScroller scrollerWidth];
- for (i=0;i<3;i++){
- l=[[NSText alloc] initWithFrame:rect];
- [l setDrawsBackground:NO];
- [l setEditable:NO];
- [l setSelectable:NO];
- [l setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin];
- switch (i){
- case 0:[l setAlignment:NSLeftTextAlignment];break;
- case 1:[l setAlignment:NSCenterTextAlignment];break;
- case 2:[l setAlignment:NSRightTextAlignment];break;
- }
- if (view) [view addSubview:l];
- label[i]=l;
- }
-
- rect.origin.y-=3;
- rect.size.height=2;
- rect.size.width+=[NSScroller scrollerWidth];
-
- box=[[NSBox alloc] initWithFrame:rect];
- [box setBoxType:NSBoxSeparator];
- [box setTitlePosition:NSNoTitle];
- [box setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin];
- if (view) [view addSubview:box];
-
- // set clientview to inner view
- view=client;
- }
- return self;
- }
- -(id)clientView{
- return view;
- }
- -(void)setStatus:(NSString*)text align:(int)pos{
- if (label[pos]) [label[pos] setString:text];
- }
- -(void)sendEvent:(NSEvent*)event{
-
- static int lastHotKey;
- int key;
- id source;
-
- // Handling of Generic Key/Mouse Events
-
- switch([event type]){
- case NSMouseEntered:
- [self disableCursorRects];
- case NSLeftMouseDown:
- case NSRightMouseDown:
- case NSOtherMouseDown:
- if([event type] != NSMouseEntered){
- dragging=[[self contentView] hitTest:[event locationInWindow]];
- [self makeFirstResponder:dragging];
- }
- case NSMouseMoved:
- case NSMouseExited:
- case NSScrollWheel:
- {
- NSView *hitView=[[self contentView] hitTest:[event locationInWindow]];
- if (hitView) EmitMouseEvent(event,hitView);
- if(![self isEnabled]) return;
- break;
- }
- case NSLeftMouseUp:
- case NSRightMouseUp:
- case NSOtherMouseUp:
- {
- //fire event for the dragged view
- if (dragging) {
- EmitMouseEvent(event,dragging);
- dragging=nil;
- } else {
- //fire the event for the recieving view (if it exists)
- NSView *hitView=[[self contentView] hitTest:[event locationInWindow]];
- if (hitView) EmitMouseEvent(event,hitView);
- }
-
- if(![self isEnabled]) return;
- break;
- }
- case NSLeftMouseDragged:
- case NSRightMouseDragged:
- case NSOtherMouseDragged:
- {
- if(dragging == nil) dragging=[[self contentView] hitTest:[event locationInWindow]];
- if(dragging) EmitMouseEvent(event,dragging);
- if(![self isEnabled]) return;
- break;
- }
- case NSKeyDown:
- case NSKeyUp:
- case NSFlagsChanged:
- {
- NSResponder *handle=(NSResponder*)NSActiveGadget();
- if(handle && EmitKeyEvent(event,handle)) return;
- break;
- }
- }
-
- // End of Generic Key/Mouse Events
-
- // Gadget Filterkey Processing
-
- switch([event type]){
- case NSKeyDown:
- if(key=bbSystemTranslateKey([event keyCode])){
- int mods=bbSystemTranslateMods([event modifierFlags]);
- BBObject *event=maxgui_maxgui_HotKeyEvent(key,mods);
- if(event!=&bbNullObject){
- lastHotKey=key;
- brl_event_EmitEvent(event);
- return;
- }
- }
- source=[self textFirstResponder];
- if(source && !filterKeyDownEvent(event,source)) return;
- if(![self isEnabled]) return;
- break;
- case NSKeyUp:
- key=bbSystemTranslateKey([event keyCode]);
- if(lastHotKey && (key==lastHotKey)){
- lastHotKey=0;
- return;
- }
- if(![self isEnabled]) return;
- break;
- }
- lastHotKey=0;
-
- // End of FilterKey Processing
-
- [super sendEvent:event];
- }
- - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
- // printf("windowview got dragenter\n");fflush(stdout);
- return YES;
- }
- - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender{
- NSPasteboard *pboard=[sender draggingPasteboard];
- if ([[pboard types] containsObject:NSFilenamesPboardType]) {
- NSArray *files=[pboard propertyListForType:NSFilenamesPboardType];
- int numberOfFiles=[files count];
- // Perform operation using the list of files
- // printf("windowview got drag\n");fflush(stdout);
- int i;
- for (i=0;i<numberOfFiles;i++)
- {
- BBString *name=bbStringFromNSString([files objectAtIndex:i]);
- maxgui_cocoamaxgui_PostCocoaGuiEvent(BBEVENT_WINDOWACCEPT,self,0,0,0,0,(BBObject*)name);
- }
-
- }
- return YES;
- }
- -(void)didResize{
- NSRect rect=[self localRect];
- [self didMove];
- PostGuiEvent(BBEVENT_WINDOWSIZE,self,0,0,rect.size.width,rect.size.height,0);
- }
- -(void)didMove{
- NSRect rect=[self localRect];
- PostGuiEvent(BBEVENT_WINDOWMOVE,self,0,0,rect.origin.x,rect.origin.y,0);
- }
- -(void)zoom{
- zooming=1;
- }
- -(NSRect)localRect{
- NSRect rect,vis;
- int style;
- rect=[self frame];
- style=gadget->style;
- if (style&WINDOW_CLIENTCOORDS){
- rect=[self contentRectForFrameRect:rect];
- if (style&WINDOW_STATUS) {
- rect.size.height-=STATUSBARHEIGHT;
- rect.origin.y+=STATUSBARHEIGHT;
- }
- }
- vis=[[NSScreen deepestScreen] visibleFrame];
- rect.origin.x-=vis.origin.x;
- rect.origin.y=vis.size.height-(rect.origin.y-vis.origin.y)-rect.size.height;
- return rect;
- }
- -(BOOL)canBecomeKeyWindow{
- return ([self isEnabled]);
- }
- -(BOOL)canBecomeMainWindow{
- return ([self isEnabled] && [self isVisible] && ([self parentWindow]==nil));
- }
- -(BOOL)becomeFirstResponder{
- return ([self isEnabled] && [self isVisible]);
- }
- -(void)setEnabled:(BOOL)e{
- enabled=e;
- if (enabled) [self makeKeyWindow];
- }
- -(BOOL)isEnabled{
- return (enabled)?YES:NO;
- }
- -(void)dealloc{
- int i;
- id sview;
- if (gadget->style&WINDOW_STATUS) {
- for (i=0; i < 3; i++) {
- if (label[i]) {
- [label[i] removeFromSuperview];
- [label[i] release];
- }
- }
-
- sview=[view superview];
- [view removeFromSuperview];
- [view release];
- [sview removeFromSuperview];
- [sview release];
- } else {
- [view removeFromSuperview];
- [view release];
- }
- [super dealloc];
- }
- @end
- // ToolView
- @implementation ToolView
- -(id)textFirstResponder{
- id r=[self firstResponder];
- //if ([r isKindOfClass:[PanelView class]]) return r;
- if ([r isKindOfClass:[NSTextView class]]){
- id d=[r delegate];
- if([d isKindOfClass:[NSTextField class]]) return d;
- }
- return r;
- }
- -(id)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)backing defer:(BOOL)flag withGadget:(nsgadget*)_gadget{
- id client;
- int i;
- NSText *l;
- NSBox *box;
- dragging=nil;
-
- self=[super initWithContentRect:rect styleMask:mask backing:backing defer:flag];
- gadget=_gadget;
- view=[[FlippedView alloc] init];
- enabled=true;
- [self setContentView:view];
- [self setAcceptsMouseMovedEvents:YES];
- [self disableCursorRects]; //Fixes NSSetPointer not sticking.
- if (gadget->style&WINDOW_STATUS){ //status){ //mask&NSTexturedBackgroundWindowMask)
- rect.origin.x=rect.origin.y=0;
- rect.size.height-=STATUSBARHEIGHT;
- client=[[FlippedView alloc] initWithFrame:rect];
- [client setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
- [view addSubview:client];
- // label for window status
- rect.origin.y=rect.size.height+3;
- rect.size.height=STATUSBARHEIGHT-4;
- rect.size.width-=[NSScroller scrollerWidth];
- for (i=0;i<3;i++){
- l=[[NSText alloc] initWithFrame:rect];
- [l setDrawsBackground:NO];
- [l setEditable:NO];
- [l setSelectable:NO];
- [l setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin];
- switch (i){
- case 0:[l setAlignment:NSLeftTextAlignment];break;
- case 1:[l setAlignment:NSCenterTextAlignment];break;
- case 2:[l setAlignment:NSRightTextAlignment];break;
- }
- if (view) [view addSubview:l];
- label[i]=l;
- }
-
- rect.origin.y-=3;
- rect.size.height=2;
- rect.size.width+=[NSScroller scrollerWidth];
-
- box=[[NSBox alloc] initWithFrame:rect];
- [box setBoxType:NSBoxSeparator];
- [box setTitlePosition:NSNoTitle];
- [box setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin];
- if (view) [view addSubview:box];
-
- // set clientview to inner view
- view=client;
- }
- if ([self respondsToSelector: @selector(setShowsToolbarButton)]) [self setShowsToolbarButton: NO];
- return self;
- }
- -(id)clientView{
- return view;
- }
- -(void)setStatus:(NSString*)text align:(int)pos{
- if (label[pos]) [label[pos] setString:text];
- }
- -(void)sendEvent:(NSEvent*)event{
- static int lastHotKey;
- int key;
- id source;
-
- // Handling of Generic Key/Mouse Events
-
- switch([event type]){
- case NSMouseEntered:
- [self disableCursorRects];
- case NSLeftMouseDown:
- case NSRightMouseDown:
- case NSOtherMouseDown:
- {
- if([event type] != NSMouseEntered){
- dragging=[[self contentView] hitTest:[event locationInWindow]];
- [self makeFirstResponder:dragging];
- }
- }
- case NSMouseMoved:
- case NSMouseExited:
- case NSScrollWheel:
- {
- NSView *hitView=[[self contentView] hitTest:[event locationInWindow]];
- if (hitView) EmitMouseEvent(event,hitView);
- if(![self isEnabled]) return;
- break;
- }
- case NSLeftMouseUp:
- case NSRightMouseUp:
- case NSOtherMouseUp:
- {
- //fire event for the dragged view
- if (dragging) {
- EmitMouseEvent(event,dragging);
- dragging=nil;
- } else {
- //fire the event for the recieving view (if it exists)
- NSView *hitView=[[self contentView] hitTest:[event locationInWindow]];
- if (hitView) EmitMouseEvent(event,hitView);
- }
-
- if(![self isEnabled]) return;
- break;
- }
- case NSLeftMouseDragged:
- case NSRightMouseDragged:
- case NSOtherMouseDragged:
- {
- if(dragging == nil) dragging=[[self contentView] hitTest:[event locationInWindow]];
- if(dragging) EmitMouseEvent(event,dragging);
- if(![self isEnabled]) return;
- break;
- }
- case NSKeyDown:
- case NSKeyUp:
- case NSFlagsChanged:
- {
- NSResponder *handle=(NSResponder*)NSActiveGadget();
- if(handle && EmitKeyEvent(event,handle)) return;
- break;
- }
- }
-
- // End of Generic Key/Mouse Events
-
- // Gadget Filterkey Processing
-
- switch([event type]){
- case NSKeyDown:
- if(key=bbSystemTranslateKey([event keyCode])){
- int mods=bbSystemTranslateMods([event modifierFlags]);
- BBObject *event=maxgui_maxgui_HotKeyEvent(key,mods);
- if(event!=&bbNullObject){
- lastHotKey=key;
- brl_event_EmitEvent(event);
- return;
- }
- }
- source=[self textFirstResponder];
- if(source && !filterKeyDownEvent(event,source)) return;
- if(![self isEnabled]) return;
- break;
- case NSKeyUp:
- key=bbSystemTranslateKey([event keyCode]);
- if(lastHotKey && (key==lastHotKey)){
- lastHotKey=0;
- return;
- }
- if(![self isEnabled]) return;
- break;
- }
- lastHotKey=0;
-
- // End of FilterKey Processing
-
- [super sendEvent:event];
- }
- - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
- // printf("windowview got dragenter\n");fflush(stdout);
- return YES;
- }
- - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender{
- NSPasteboard *pboard=[sender draggingPasteboard];
- if ([[pboard types] containsObject:NSFilenamesPboardType]) {
- NSArray *files=[pboard propertyListForType:NSFilenamesPboardType];
- int numberOfFiles=[files count];
- // Perform operation using the list of files
- // printf("windowview got drag\n");fflush(stdout);
- int i;
- for (i=0;i<numberOfFiles;i++)
- {
- BBString *name=bbStringFromNSString([files objectAtIndex:i]);
- maxgui_cocoamaxgui_PostCocoaGuiEvent(BBEVENT_WINDOWACCEPT,self,0,0,0,0,(BBObject*)name);
- }
-
- }
- return YES;
- }
- -(void)didResize{
- if (zooming) {
- zooming=0;
- [self didMove];
- }
- NSRect rect=[self localRect];
- PostGuiEvent(BBEVENT_WINDOWSIZE,self,0,0,rect.size.width,rect.size.height,0);
- }
- -(void)didMove{
- NSRect rect=[self localRect];
- PostGuiEvent(BBEVENT_WINDOWMOVE,self,0,0,rect.origin.x,rect.origin.y,0);
- }
- -(void)zoom{
- zooming=1;
- }
- -(NSRect)localRect{
- NSRect rect,vis;
- int style;
- rect=[self frame];
- style=gadget->style;
- if (style&WINDOW_CLIENTCOORDS){
- rect=[self contentRectForFrameRect:rect];
- if (style&WINDOW_STATUS) {
- rect.size.height-=STATUSBARHEIGHT;
- rect.origin.y+=STATUSBARHEIGHT;
- }
- }
- vis=[[NSScreen deepestScreen] visibleFrame];
- rect.origin.x=rect.origin.x-vis.origin.x;
- rect.origin.y=vis.size.height-(rect.origin.y-vis.origin.y)-rect.size.height;
- return rect;
- }
- -(BOOL)canBecomeKeyWindow{
- return ([self isEnabled]);
- }
- -(BOOL)canBecomeMainWindow{
- return ([self isEnabled] && [self isVisible] && ([self parentWindow]==nil));
- }
- -(BOOL)becomeFirstResponder{
- return ([self isEnabled] && [self isVisible]);
- }
- -(void)setEnabled:(BOOL)e{
- enabled=e;
- if (enabled) [self makeKeyWindow];
- }
- -(BOOL)isEnabled{
- return (enabled)?YES:NO;
- }
- -(void)dealloc{
- int i;
- id sview;
- if (gadget->style&WINDOW_STATUS) {
- for (i=0; i < 3; i++) {
- if (label[i]) {
- [label[i] removeFromSuperview];
- [label[i] release];
- }
- }
-
- sview=[view superview];
- [view removeFromSuperview];
- [view release];
- [sview removeFromSuperview];
- [sview release];
- } else {
- [view removeFromSuperview];
- [view release];
- }
- [super dealloc];
- }
- @end
- // global app stuff
- void NSBegin(){
- GlobalApp=[[CocoaApp alloc] init];
- HaltMouseEvents=0;
- }
- void NSEnd(){
- [GlobalApp release];
- }
- int NSActiveGadget(){
- NSWindow *window;
- NSResponder *responder;
- window=[NSApp keyWindow];
- if (!window) return 0;
- responder=[window firstResponder];
- if (!responder) return (int)window;
- if ([responder isKindOfClass:[NSTextView class]] &&
- [window fieldEditor:NO forObject:nil] != nil) {
- NSTextView *view=(NSTextView*)responder;
- return (int)[view delegate];
- }
- return (int)responder;
- }
- void NSInitGadget(nsgadget *gadget){
- NSRect rect;
- NSRect vis;
- NSString *text;
- NSView *view;
- NSWindow *window;
- NSButton *button;
- NSTextField *textfield;
- TextView *textarea;
- NSControl *combobox;
- Toolbar *toolbar;
- TabView *tabber;
- TreeView *treeview;
- HTMLView *htmlview;
- PanelView *panel;
- PanelViewContent *pnlcontent;
- CanvasView *canvas;
- ListView *listbox;
- NSText *label;
- NSBox *box;
- NSSlider *slider;
- NSScroller *scroller;
- NSStepper *stepper;
- NSProgressIndicator *progbar;
- NSMenu *menu;
- NSMenuItem *menuitem;
- NodeItem *node,*parent;
- nsgadget *group;
- int style;
- int flags;
- NSImage *image;
-
- rect=NSMakeRect(gadget->x,gadget->y,gadget->w,gadget->h);
- text=NSStringFromBBString(gadget->textarg);
- style=gadget->style;flags=0;
- group=gadget->group;
- if (group==(nsgadget*)&bbNullObject) group=0;
- if (group) view=gadget->group->view;
-
- switch (gadget->internalclass){
- case GADGET_DESKTOP:
- rect=[[NSScreen deepestScreen] frame];
- gadget->x=rect.origin.x;
- gadget->y=rect.origin.y;
- gadget->w=rect.size.width;
- gadget->h=rect.size.height;
- break;
- case GADGET_WINDOW:
- vis=[[NSScreen deepestScreen] visibleFrame];
- rect.origin.x+=vis.origin.x;
- rect.origin.y=vis.origin.y+vis.size.height-rect.origin.y-rect.size.height;
- if (style&WINDOW_TITLEBAR) flags|=NSTitledWindowMask|NSClosableWindowMask;
- if (style&WINDOW_RESIZABLE){
- flags|=NSResizableWindowMask;
- if (!(group && (group->internalclass==GADGET_WINDOW))) flags |=NSMiniaturizableWindowMask;
- }
- if (style&WINDOW_TOOL) flags|=NSUtilityWindowMask;
- [NSApp activateIgnoringOtherApps:YES];
- if (!(style&WINDOW_CLIENTCOORDS)){
- rect=[NSWindow contentRectForFrameRect:rect styleMask:flags];
- }else{
- if (style&WINDOW_STATUS) {
- rect.origin.y-=STATUSBARHEIGHT;
- rect.size.height+=STATUSBARHEIGHT;
- }
- }
- if (!(style&WINDOW_TOOL)) {
- window=[[WindowView alloc] initWithContentRect:rect styleMask:flags backing:NSBackingStoreBuffered defer:YES withGadget:gadget];
- } else {
- window=[[ToolView alloc] initWithContentRect:rect styleMask:flags backing:NSBackingStoreBuffered defer:YES withGadget:gadget];
- }
- [window setOpaque:NO];
- [window setAlphaValue:.999f];
-
- if (style&WINDOW_HIDDEN) [window orderOut:window]; else [window makeKeyAndOrderFront:NSApp];
-
- if (group && (group->internalclass==GADGET_WINDOW)){
- NSWindow *parent;
- parent=(NSWindow*)group->handle;
- if(!(style&WINDOW_HIDDEN)) [parent addChildWindow:window ordered:NSWindowAbove];
- [window setParentWindow:parent];
- }
-
- if (style&WINDOW_ACCEPTFILES)
- [window registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
-
- [window setTitle:text];
- [window setDelegate:GlobalApp];
- gadget->handle=window;
- gadget->view=[window clientView];
- break;
-
- case GADGET_BUTTON:
- button=[[NSButton alloc] initWithFrame:rect];
- [button setTitle:text];
-
- [button setBezelStyle:NSRoundedBezelStyle];
-
- switch (style&7){
- case 0:
- // Push Button Size Hack
- if (gadget->h > 30) {
- [button setBezelStyle:NSRegularSquareBezelStyle];
- } else {
- if (gadget->h < 24) [button setBezelStyle:NSShadowlessSquareBezelStyle];
- else [button setBezelStyle:NSRoundedBezelStyle];
- }
- break;
- case BUTTON_CHECKBOX:
- if (style&BUTTON_PUSH){
- [button setBezelStyle:NSShadowlessSquareBezelStyle];
- [button setButtonType:NSPushOnPushOffButton];
- } else {
- [button setButtonType:NSSwitchButton];
- }
- break;
- case BUTTON_RADIO:
- if (style&BUTTON_PUSH){
- [button setBezelStyle:NSShadowlessSquareBezelStyle];
- [button setButtonType:NSPushOnPushOffButton];
- } else {
- [button setButtonType:NSRadioButton];
- }
- break;
- case BUTTON_OK:
- [button setKeyEquivalent:@"\r"];
- break;
- case BUTTON_CANCEL:
- [button setKeyEquivalent:@"\x1b"];
- break;
- }
- [button setTarget:GlobalApp];
- [button setAction:@selector(buttonPush:)];
- if (view) [view addSubview:button];
- gadget->handle=button;
- gadget->view=button;
- break;
- case GADGET_PANEL:
- panel=[[PanelView alloc] initWithFrame:rect];
- [panel setContentViewMargins:NSMakeSize(0.0,0.0)];
- pnlcontent=[[PanelViewContent alloc] initWithFrame:[[panel contentView] frame]];
- [pnlcontent setAutoresizesSubviews:NO];
- [panel setContentView:pnlcontent];
- [panel setGadget:gadget];
- [panel setStyle:style];
- [panel setEnabled:true];
- [panel setTitle:text];
- [pnlcontent setAlpha:1.0];
- if (view) [view addSubview:panel];
- gadget->view=pnlcontent;
- gadget->handle=panel;
- break;
- case GADGET_CANVAS:
- canvas=[[CanvasView alloc] initWithFrame:rect];
- [canvas setAutoresizesSubviews:NO];
- [canvas setGadget:gadget];
- if (view) [view addSubview:canvas];
- [canvas setStyle:style|PANEL_ACTIVE];
- [canvas setEnabled:true];
- gadget->view=[canvas contentView];
- gadget->handle=canvas;
- break;
- case GADGET_TEXTFIELD:
- if (style==TEXTFIELD_PASSWORD){
- textfield=[[NSSecureTextField alloc] initWithFrame:rect];
- }else{
- textfield=[[NSTextField alloc] initWithFrame:rect];
- }
- [textfield setDelegate:GlobalApp];
- [textfield setEditable:YES];
- [[textfield cell] setWraps:NO];
- [[textfield cell] setScrollable:YES];
- if (view) [view addSubview:textfield];
- gadget->handle=textfield;
- gadget->view=textfield;
- break;
- case GADGET_TEXTAREA://http://developer.apple.com/documentation/Cocoa/Conceptual/TextUILayer/Tasks/TextInScrollView.html
- textarea=[[TextView alloc] initWithFrame:rect];
- if (style&TEXTAREA_READONLY) [textarea setEditable:NO];
- if (style&TEXTAREA_WORDWRAP) [textarea setWordWrap:YES];
- if (view) [view addSubview:[textarea getScroll]];
- gadget->handle=textarea;
- gadget->view=[textarea getScroll];// simon was here textarea;
- break;
- case GADGET_COMBOBOX:
- if (rect.size.height > 26) rect.size.height=26;
- combobox=[[NSComboBox alloc] initWithFrame:rect];
- [combobox setUsesDataSource:NO];
- [combobox setCompletes:YES];
- [combobox setDelegate:GlobalApp];
- [combobox setEditable:(style&COMBOBOX_EDITABLE)?YES:NO];
- [combobox setSelectable:YES];
- if (view) [view addSubview:combobox];
- gadget->handle=combobox;
- gadget->view=combobox;
- break;
- case GADGET_LISTBOX:
- listbox=[[ListView alloc] initWithFrame:rect];
- if (view) [view addSubview:listbox];
- gadget->handle=listbox;
- gadget->view=listbox;
- break;
- case GADGET_TOOLBAR:
- toolbar=[[Toolbar alloc] initWithIdentifier:text];
- [toolbar setSizeMode:NSToolbarSizeModeSmall];
- [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly];
- [toolbar setDelegate:GlobalApp];
- window=(WindowView*)group->handle;
- [window setToolbar:toolbar];
- gadget->handle=toolbar;
- gadget->view=[window clientView];
- break;
- case GADGET_TABBER:
- tabber=[[TabView alloc] initWithFrame:rect];
- [tabber setAutoresizesSubviews:NO];
- if (view) [view addSubview:tabber]; //[tabber hostView]];
- gadget->handle=tabber;
- gadget->view=[tabber clientView];
- break;
- case GADGET_TREEVIEW:
- treeview=[[TreeView alloc] initWithFrame:rect]; //NSOutlineView
- if (view) [view addSubview:treeview];
- gadget->handle=treeview;
- gadget->view=treeview;
- break;
- case GADGET_HTMLVIEW:
- htmlview=[[HTMLView alloc] initWithFrame:rect];
- if (view) [view addSubview:htmlview];
- [htmlview setStyle: style];
- gadget->handle=htmlview;
- gadget->view=htmlview;
- break;
- case GADGET_LABEL: /* BaH */
- switch (style&3) {
- case LABEL_SEPARATOR:
-
- box=[[NSBox alloc] initWithFrame:rect];
-
- [box setTitle:text];
- [box setBoxType:NSBoxSeparator];
- [box setTitlePosition:NSNoTitle];
-
- [box setContentView:[[FlippedView alloc] init]];
-
- if (view) [view addSubview:box];
- gadget->handle=box;
- gadget->view=[box contentView];
-
- break;
-
- default:
-
- textfield=[[NSTextField alloc] initWithFrame:rect];
-
- [textfield setEditable:NO];
- [textfield setDrawsBackground:NO];
-
- if ((style&3)==LABEL_SUNKENFRAME) {
- [textfield setBezeled:YES];
- [textfield setBezelStyle:NSTextFieldSquareBezel];
- } else {
- [textfield setBezeled:NO];
- if ((style&3)==LABEL_FRAME)
- [textfield setBordered:YES];
- else
- [textfield setBordered:NO];
- }
-
- [[textfield cell] setWraps:YES];
- [[textfield cell] setScrollable:NO];
- [textfield setStringValue:text];
-
- switch (style&24){
- case LABEL_LEFT:[textfield setAlignment:NSLeftTextAlignment];break;
- case LABEL_RIGHT:[textfield setAlignment:NSRightTextAlignment];break;
- case LABEL_CENTER:[textfield setAlignment:NSCenterTextAlignment];break;
- }
-
- if (view) [view addSubview: textfield];
- gadget->handle=textfield;
- gadget->view=textfield;
-
- break;
- }
- break;
- case GADGET_SLIDER:
- switch (style&12){
- case SLIDER_SCROLLBAR:
- if (rect.size.width>rect.size.height) {
- rect.size.height=[NSScroller scrollerWidth];
- }
- else{
- rect.size.width=[NSScroller scrollerWidth];
- }
- scroller=[[NSScroller alloc] initWithFrame:rect];
- [scroller setEnabled:YES];
- [scroller setArrowsPosition:NSScrollerArrowsDefaultSetting];
- [scroller setAction:@selector(scrollerSelect:)];
- if (view) [view addSubview:scroller];
- gadget->handle=scroller;
- gadget->view=scroller;
- break;
- case SLIDER_TRACKBAR:
- slider=[[NSSlider alloc] initWithFrame:rect];
- [slider setEnabled:YES];
- [slider setAction:@selector(sliderSelect:)];
- if (view) [view addSubview:slider];
- gadget->handle=slider;
- gadget->view=slider;
- break;
- case SLIDER_STEPPER:
- stepper=[[NSStepper alloc] initWithFrame:rect];
- [stepper setEnabled:YES];
- [stepper setAction:@selector(sliderSelect:)];
- [stepper setValueWraps:NO];
- if (view) [view addSubview:stepper];
- gadget->handle=stepper;
- gadget->view=stepper;
- break;
- }
- break;
- case GADGET_PROGBAR:
- progbar=[[NSProgressIndicator alloc] initWithFrame:rect];
- [progbar setStyle:NSProgressIndicatorBarStyle];
- [progbar setIndeterminate:NO];
- [progbar setMaxValue:1.0];
- if (view) [view addSubview:progbar];
- gadget->handle=progbar;
- gadget->view=progbar;
- break;
- case GADGET_MENUITEM:
- // Allows a popup-menu to be created with no text without crashing.
- if ([text length] || (group->internalclass == GADGET_DESKTOP)) {
- menuitem=[[NSMenuItem alloc] initWithTitle:text action:@selector(menuSelect:) keyEquivalent:@""];
- [menuitem setTag:style];
- [GlobalApp addMenuItem:menuitem];
- }
- else{
- menuitem=(NSMenuItem*)[NSMenuItem separatorItem];
- }
- if (group){
- switch (group->internalclass){
- case GADGET_WINDOW:
- menu=[[NSMenu alloc] initWithTitle:text];
- [menu setAutoenablesItems:NO];
- [menu setSubmenu:menu forItem:menuitem];
- [menu release];
- menu=[NSApp mainMenu];
- [menu addItem:menuitem];
- if ([text length]){
- [menuitem release];
- }
- break;
- case GADGET_MENUITEM:
- menu=(NSMenu*)[group->handle submenu];
- if (!menu){
- menu=(NSMenu*)[[NSMenu alloc] initWithTitle:text];
- [menu setAutoenablesItems:NO];
- [group->handle setSubmenu:menu];
- [menu addItem:menuitem];
- [menu release];
- } else {
- [menu addItem:menuitem];
- }
- if ([text length]){
- [menuitem release];
- }
- break;
- }
- }
- gadget->handle=menuitem;
- break;
- case GADGET_NODE:
- if (!group) break;
- parent=0;
- switch (group->internalclass){
- case GADGET_TREEVIEW:
- parent=[((TreeView*)group->handle) rootNode];
- break;
- case GADGET_NODE:
- parent=(NodeItem*)group->handle;
- break;
- }
- if (!parent) break;
- node=[[NodeItem alloc] initWithTitle:text];
- int index=style;
- if (index==-1) index=[parent count];
- if (index>[parent count]) index=[parent count];
- [node attach:parent atIndex:index];
- gadget->handle=node;
- break;
- }
- }
- @class color_delegate;
- @interface color_delegate:NSObject{}
- @end
- @implementation color_delegate
- - (void)windowWillClose:(NSNotification *)aNotification{[NSApp stopModal];}
- @end
- int NSColorRequester(int r,int g,int b){
- NSColorPanel *panel;
- NSColor *color;
- color_delegate *dele;
- dele=[[color_delegate alloc] init];
- color=[NSColor colorWithCalibratedRed:r/255.0L green:g/255.0L blue:b/255.0L alpha:1.0];
- panel=[NSColorPanel sharedColorPanel];
- [panel setColor:color];
- [panel setDelegate:dele];
- [NSApp runModalForWindow:panel];
- color=[panel color];
- if (color){
- color=[color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- r=(int)((255*[color redComponent])+0.5);
- g=(int)((255*[color greenComponent])+0.5);
- b=(int)((255*[color blueComponent])+0.5);
- }
- return 0xff000000|(r<<16)|(g<<8)|b;
- }
- @class font_delegate;
- @interface font_delegate:NSObject{
- NSFont *_font;
- }
- -(id)initWithFont:(NSFont*)font;
- -(void)changeFont:(id)sender;
- -(id)font;
- -(void)windowWillClose:(NSNotification *)aNotification;
- -(unsigned int)validModesForFontPanel:(NSFontPanel *)fontPanel;
- @end
- @implementation font_delegate
- -(id)initWithFont:(NSFont*)font{
- _font=font;
- return self;
- }
- -(id)font{
- return _font;
- }
- -(void)changeFont:(id)sender{
- _font=[sender convertFont:_font];
- return;
- }
- - (void)windowWillClose:(NSNotification *)aNotification{
- [NSApp stopModal];
- }
- -(unsigned int)validModesForFontPanel:(NSFontPanel *)fontPanel{
- return NSFontPanelFaceModeMask|NSFontPanelSizeModeMask|NSFontPanelCollectionModeMask;//|NSFontPanelUnderlineEffectModeMask;
- }
- @end
- int NSGetSysColor(int colorindex,int* red,int* green,int* blue){
-
- float r,g,b;
- NSColor* c;
- NSWindow* w;
-
- switch(colorindex){
- case GUICOLOR_WINDOWBG:
- w=[[NSWindow alloc] initWithContentRect:NSZeroRect styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:YES];
- c=[w backgroundColor];
- [w release];
- break;
- case GUICOLOR_GADGETBG:
- c=[NSColor controlBackgroundColor];
- break;
- case GUICOLOR_GADGETFG:
- c=[NSColor controlTextColor];
- break;
- case GUICOLOR_SELECTIONBG:
- c=[NSColor selectedTextBackgroundColor];
- break;
- default:
- return 0;
- break;
- }
-
- [[c colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&r green:&g blue:&b alpha:NULL];
- *red=(int)(255 * r);
- *green=(int)(255 * g);
- *blue=(int)(255 * b);
-
- return 1;
- }
- NSFont *NSRequestFont(NSFont *font){
- NSFontPanel *panel;
- font_delegate *dele;
- if (!font) font=[NSFont userFontOfSize:0];
- dele=[[font_delegate alloc] initWithFont:font];
- panel=[NSFontPanel sharedFontPanel];
- if (font) [panel setPanelFont:font isMultiple:NO];
- [panel setEnabled:YES];
- [panel setDelegate:dele];
- [NSApp runModalForWindow:panel];
- return [dele font];
- }
- NSFont *NSLoadFont(BBString *name,double size,int flags){
- NSString *text;
- NSFont *font;
- NSFontManager *manager;
- text=NSStringFromBBString(name);
- font=[NSFont fontWithName:text size:size];
- if (!font) font=[NSFont systemFontOfSize:size];
- if (flags){
- manager=[NSFontManager sharedFontManager];
- if (flags&FONT_BOLD) font=[manager convertFont:font toHaveTrait:NSBoldFontMask];
- if (flags&FONT_ITALIC) font=[manager convertFont:font toHaveTrait:NSItalicFontMask];
- }
- [font retain];
- return font;
- }
- NSFont *NSGetDefaultFont(){
- return [NSFont systemFontOfSize:[NSFont systemFontSize]];
- }
- BBString *NSFontName(NSFont *font){
- return bbStringFromNSString([font displayName]);
- }
- int NSFontStyle(NSFont *font){
- int intBBStyleFlags;
- int intCocoaFontTraits;
- NSFontManager *manager;
-
- manager=[NSFontManager sharedFontManager];
- intCocoaFontTraits=[manager traitsOfFont: font];
-
- intBBStyleFlags=0;
- if (intCocoaFontTraits & NSBoldFontMask) intBBStyleFlags|=FONT_BOLD;
- if (intCocoaFontTraits & NSItalicFontMask) intBBStyleFlags|=FONT_ITALIC;
-
- return intBBStyleFlags;
- }
- double NSFontSize(NSFont *font){
- return (double)[font pointSize];
- }
- void* NSSuperview(NSView* handle){
- if(handle) return [handle superview];
- return 0;
- }
- // generic gadget commands
- void NSFreeGadget(nsgadget *gadget){
- nsgadget *group;
- NSWindow *parent;
- TextView *textview;
- FlippedView * flipped;
- if (gadget->textcolor){
- [gadget->textcolor release];
- gadget->textcolor=0;
- }
- if (gadget->handle){
- switch (gadget->internalclass){
- case GADGET_WINDOW:
- if ([gadget->handle parentWindow]!=nil){
- [[gadget->handle parentWindow] removeChildWindow:(NSWindow*)gadget->handle];
- }
- [gadget->handle close];
- break;
- case GADGET_NODE:
- [gadget->handle remove];
- [gadget->handle autorelease];
- break;
- case GADGET_MENUITEM:
- [GlobalApp removeMenuItem:gadget->handle];
- [[gadget->handle menu] removeItem:gadget->handle];
- break;
- case GADGET_TEXTAREA:
- textview=(TextView*)gadget->handle;
- [gadget->view removeFromSuperview];
- [textview free];
- [textview autorelease];
- break;
- case GADGET_LABEL:
- switch (gadget->style&3) {
- case LABEL_SEPARATOR:
- flipped=(FlippedView*)gadget->view;
- [flipped removeFromSuperview];
- [gadget->handle removeFromSuperview];
- [flipped release];
- break;
- default:
- [gadget->view removeFromSuperview];
- break;
- }
- [gadget->handle autorelease];
- break;
- case GADGET_TABBER:
- flipped=(FlippedView*)gadget->view;
- [flipped removeFromSuperview];
- [gadget->handle removeFromSuperview];
- [flipped release];
- //Cocoa throws an exception if items exist when handle is autoreleased.
- NSClearItems(gadget);
- [gadget->handle autorelease];
- break;
- case GADGET_PANEL:
- [gadget->handle setColor:nil];
- [gadget->handle removeFromSuperview];
- [gadget->handle autorelease];
- break;
- default:
- [[gadget->view superview] setNeedsDisplayInRect:[gadget->view frame]];
- [gadget->view removeFromSuperview];
- [gadget->handle autorelease];
- break;
- }
- }
- gadget->handle=0;
- }
- void NSEnable(nsgadget *gadget,int state){
- switch (gadget->internalclass){
- case GADGET_WINDOW:
- case GADGET_SLIDER:
- case GADGET_TEXTFIELD:
- case GADGET_MENUITEM:
- case GADGET_BUTTON:
- case GADGET_LISTBOX:
- case GADGET_COMBOBOX:
- case GADGET_TREEVIEW:
- case GADGET_PANEL:
- case GADGET_CANVAS:
- [gadget->handle setEnabled:state];
- break;
- case GADGET_TEXTAREA:
- [gadget->handle setSelectable:state];
- if (!(gadget->style&TEXTAREA_READONLY)) [gadget->handle setEditable:state];
- break;
- }
- }
- void NSShow(nsgadget *gadget,int state){
- switch (gadget->internalclass){
- case GADGET_WINDOW:
- if (state==[gadget->handle isVisible]) return;
- if (state) {
- if(
- (gadget->group!=&bbNullObject) &&
- (gadget->group->internalclass==GADGET_WINDOW) &&
- ([gadget->handle parentWindow]==nil)
- )
- {
- [gadget->group->handle addChildWindow: gadget->handle ordered:NSWindowAbove];
- }
- [gadget->handle makeKeyAndOrderFront:NSApp];
-
- NSWindow *window=(NSWindow*)gadget->handle;
-
- [window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
-
- } else {
- if([gadget->handle parentWindow]!=nil) [[gadget->handle parentWindow] removeChildWindow:(NSWindow*)gadget->handle];
- [gadget->handle orderOut:NSApp];
- }
- break;
- case GADGET_TOOLBAR:
- [gadget->handle setVisible:state];
- break;
- default:
- [gadget->handle setHidden:!state];
- }
- }
- void NSCheck(nsgadget *gadget,int state){
- NSButton *button;
- switch (gadget->internalclass){
- case GADGET_MENUITEM:
- [gadget->handle setState:state];
- break;
- case GADGET_BUTTON:
- button=(NSButton *)gadget->handle;
- if(state==NSMixedState) [button setAllowsMixedState:YES]; else [button setAllowsMixedState:NO];
- [button setState:state];
- break;
- }
- }
- void NSPopupMenu(nsgadget *gadget,nsgadget *menugadget){
- NSView *view;
- NSWindow *window;
- NSMenuItem *menuitem;
- NSEvent *event;
- NSPoint loc;
-
- window=(NSWindow*)gadget->handle;
- view=gadget->view;
- menuitem=(NSMenuItem*)menugadget->handle;
- event=[NSEvent
- mouseEventWithType:NSRightMouseUp
- location:[window convertScreenToBase:[NSEvent mouseLocation]]
- modifierFlags:nil
- timestamp:0
- windowNumber:[window windowNumber]
- context:nil
- eventNumber:nil
- clickCount:1
- pressure:0];
- [NSMenu popUpContextMenu:[menuitem submenu] withEvent:event forView:view];
- // [event release];
- }
- int NSState(nsgadget *gadget){
- NSWindow *window;
- TextView *textview;
- NSButton *button;
- NSView *view;
- Toolbar *toolbar;
- HTMLView *browser;
- NSMenuItem *menuItem;
- int state;
- state=0;
- switch (gadget->internalclass){
- case GADGET_TEXTAREA:
- textview=(TextView*)gadget->handle;
- if ([textview isHidden]) state|=STATE_HIDDEN;
- if ((!(gadget->style&TEXTAREA_READONLY)) && (![textview isEditable])) state|=STATE_DISABLED;
- break;
- case GADGET_HTMLVIEW:
- browser=(HTMLView*)gadget->handle;
- return [browser loaded];
- case GADGET_WINDOW:
- window=(NSWindow*)gadget->handle;
- if ([window isMiniaturized]) state|=STATE_MINIMIZED;
- if ([window isZoomed]) state|=STATE_MAXIMIZED;
- if (![window isVisible]) state|=STATE_HIDDEN;
- break;
- case GADGET_MENUITEM:
- menuItem=(NSMenuItem*)gadget->handle;
- if ([menuItem state]==NSOnState) state|=STATE_SELECTED;
- if (![menuItem isEnabled]) state|=STATE_DISABLED;
- break;
- case GADGET_BUTTON:
- button=(NSButton *)gadget->handle;
- switch (gadget->style&7){
- case BUTTON_RADIO: case BUTTON_CHECKBOX:
- if ([button state]==NSOnState) state|=STATE_SELECTED;
- if ([button state]==NSMixedState) state|=STATE_INDETERMINATE;
- }
- if ([button isHidden]) state|=STATE_HIDDEN;
- if (![button isEnabled]) state|=STATE_DISABLED;
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- if ([toolbar isVisible]==NO) state|=STATE_HIDDEN;
- break;
- case GADGET_PROGBAR:
- view=(NSView*)gadget->handle;
- if ([view isHidden]) state|=STATE_HIDDEN;
- break;
- default:
- view=(NSView*)gadget->handle;
- if ([view isHidden]) state|=STATE_HIDDEN;
- if (![view isEnabled]) state|=STATE_DISABLED;
- break;
- }
- return state;
- }
- void NSSetMinimumSize(nsgadget *gadget,int width,int height){
- NSWindow *window;
- NSRect rect;
- int style;
- window=(NSWindow*)gadget->handle;
- rect.origin.x=0;
- rect.origin.y=0;
- rect.size.width=width;
- rect.size.height=height;
- style=gadget->style;
- if (!(style&WINDOW_CLIENTCOORDS)){
- rect=[window contentRectForFrameRect:rect];
- rect.size.width-=rect.origin.x;
- rect.size.height-=rect.origin.y;
- }else{
- if (style&WINDOW_STATUS) rect.size.height+=STATUSBARHEIGHT;
- }
- [window setContentMinSize:rect.size];
- }
- void NSSetMaximumSize(nsgadget *gadget,int width,int height){
- NSWindow *window;
- NSRect rect;
- int style;
- window=(NSWindow*)gadget->handle;
- rect.origin.x=0;
- rect.origin.y=0;
- rect.size.width=width;
- rect.size.height=height;
- style=gadget->style;
- if (!(style&WINDOW_CLIENTCOORDS)){
- rect=[window contentRectForFrameRect:rect];
- rect.size.width-=rect.origin.x;
- rect.size.height-=rect.origin.y;
- }else{
- if (style&WINDOW_STATUS) rect.size.height+=STATUSBARHEIGHT;
- }
- [window setContentMaxSize:rect.size];
- }
- void NSSetStatus(nsgadget *gadget,BBString *data,int pos){
- NSString *text;
- WindowView *window;
- ToolView *toolview;
- text=NSStringFromBBString(data);
- if ((gadget->style&WINDOW_TOOL) == 0) {
- window=(WindowView*)gadget->handle;
- [window setStatus:text align:pos];
- } else {
- toolview =(ToolView*)gadget->handle;
- [toolview setStatus:text align:pos];
- }
- }
- int NSClientWidth(nsgadget *gadget){
- NSRect frame;
- if (gadget->internalclass==GADGET_DESKTOP){
- frame=[[NSScreen deepestScreen] visibleFrame];
- return frame.size.width;
- }
- if (!gadget->view) return gadget->w;
- frame=[gadget->view frame];
- return frame.size.width;
- }
- int NSClientHeight(nsgadget *gadget){
- NSRect frame;
- if (gadget->internalclass==GADGET_DESKTOP){
- frame=[[NSScreen deepestScreen] visibleFrame];
- return frame.size.height;
- }
- if (!gadget->view) return gadget->h;
- frame=[gadget->view frame];
- return frame.size.height;
- }
- void NSRedraw(nsgadget *gadget){
- NSView *view;
- switch (gadget->internalclass){
- case GADGET_WINDOW:
- //window=(NSWindow*)gadget->handle;
- break;
- case GADGET_PANEL:
- break;
- default:
- view=(NSView*)gadget->handle;
- [view setNeedsDisplay];
- }
- }
- void NSActivate(nsgadget *gadget,int code){
- NSWindow *window;
- NSView *view;
- NSRect frame;
- NodeItem *node;
- TreeView *treeview;
- HTMLView *browser;
- TextView *textview;
- NSTextField *textfield;
- NSText *text;
- NSComboBox *combo;
- // generic commands
- switch (code){
- case ACTIVATE_REDRAW:
- NSRedraw(gadget);
- return;
- }
-
- // gadget specific
- switch (gadget->internalclass){
- case GADGET_WINDOW:
- window=(NSWindow*)gadget->handle;
- switch (code){
- case ACTIVATE_FOCUS:
- if([window isVisible]) [window makeKeyAndOrderFront:NSApp];
- break;
- case ACTIVATE_CUT:
- break;
- case ACTIVATE_COPY:
- break;
- case ACTIVATE_PASTE:
- break;
- case ACTIVATE_MINIMIZE:
- NSShow(gadget,true);
- [window miniaturize:window];
- break;
- case ACTIVATE_MAXIMIZE:
- if ([window isMiniaturized]) [window deminiaturize:window];
- if ([window isZoomed]==NO) [window performZoom:window];
- NSShow(gadget,true);
- break;
- case ACTIVATE_RESTORE:
- if ([window isMiniaturized]) [window deminiaturize:window];
- if ([window isZoomed]) [window performZoom:window];
- NSShow(gadget,true);
- break;
- // case ACTIVATE_FULLSCREEN:
- // [NSApp setPresentationOptions:NSApplicationPresentationFullScreen];
- // break;
- }
- break;
-
- case GADGET_TEXTFIELD:
- textfield=(NSTextField*)gadget->handle;
- window=[textfield window];
- if (window)
- switch (code){
- case ACTIVATE_FOCUS:
- [window makeFirstResponder:textfield];
- break;
- case ACTIVATE_CUT:
- text=[[textfield window] fieldEditor:YES forObject:textfield];
- [text cut:textfield];
- break;
- case ACTIVATE_COPY:
- text=[[textfield window] fieldEditor:YES forObject:textfield];
- [text copy:textfield];
- break;
- case ACTIVATE_PASTE:
- text=[[textfield window] fieldEditor:YES forObject:textfield];
- [text paste:textfield];
- break;
- }
- break;
-
- case GADGET_TEXTAREA:
- textview=(TextView*)gadget->handle;
- switch (code){
- case ACTIVATE_FOCUS:
- window=[textview window];
- if (window) [window makeFirstResponder:textview];
- break;
- case ACTIVATE_CUT:
- [textview cut:textview];
- break;
- case ACTIVATE_COPY:
- [textview copy:textview];
- break;
- case ACTIVATE_PASTE:
- [textview pasteAsPlainText:textview];//paste:textview];
- break;
- case ACTIVATE_PRINT:
- [textview print:textview];
- break;
- }
- break;
-
- case GADGET_NODE:
- node=(NodeItem*)gadget->handle;
- treeview=[node getOwner];
- switch (code){
- case ACTIVATE_SELECT:
- [treeview selectNode:node];
- break;
- case ACTIVATE_EXPAND:
- [treeview expandNode:node];
- break;
- case ACTIVATE_COLLAPSE:
- [treeview collapseNode:node];
- break;
- }
- break;
-
- case GADGET_COMBOBOX:
- switch (code){
- case ACTIVATE_FOCUS:
- combo=(NSComboBox*)gadget->handle;
- [combo selectText:nil];
- break;
- }
- break;
-
- case GADGET_HTMLVIEW:
- browser=(HTMLView*)gadget->handle;
- switch(code){
- case ACTIVATE_COPY:
- [browser copy:browser];
- break;
- case ACTIVATE_BACK:
- [browser goBack:browser];
- break;
- case ACTIVATE_FORWARD:
- [browser goForward:browser];
- break;
- case ACTIVATE_PRINT:
- view=[[[browser mainFrame] frameView] documentView];
- if (view != nil) [view print:view];
- break;
- }
-
- default:
- switch (code){
- case ACTIVATE_FOCUS:
- window=[gadget->handle window];
- if (window) [window makeFirstResponder:gadget->handle];
- break;
- }
- }
- }
- void NSRethink(nsgadget *gadget){
- NSView *view;
- NSRect rect,vis;
- TextView *textview;
- TabView *tabber;
- NSButton *button;
- NSControl *combobox;
- int shouldhide;
-
- view=(NSView*)gadget->handle;
- rect=NSMakeRect(gadget->x,gadget->y,gadget->w,gadget->h);
-
- shouldhide=FALSE;
-
- switch(gadget->internalclass){
- case GADGET_WINDOW:
- vis=[[NSScreen deepestScreen] visibleFrame];
- rect.origin.x+=vis.origin.x;
- rect.origin.y=vis.origin.y+vis.size.height-rect.origin.y-rect.size.height;
- if ((gadget->style&WINDOW_CLIENTCOORDS)!=0){
- if (gadget->style&WINDOW_STATUS) {
- rect.origin.y-=STATUSBARHEIGHT;
- rect.size.height+=STATUSBARHEIGHT;
- }
- rect=[(NSWindow*)view frameRectForContentRect:rect];
- }
-
- if(![view isVisible]) shouldhide=TRUE;
- [view setFrame:rect display:YES];
- if(shouldhide) [view orderOut:view];
- return;
- case GADGET_NODE:
- case GADGET_MENUITEM:
- case GADGET_TOOLBAR:
- return;
- case GADGET_TEXTAREA:
- textview=(TextView*)view;
- [textview setScrollFrame:rect];
- return;
- case GADGET_COMBOBOX:
- if (rect.size.height > 26) rect.size.height=26;
- break;
- case GADGET_BUTTON:
- button=(NSButton*)view;
- // Push Button Size Hack
- if ((gadget->style&7)==0){
- if (gadget->h > 30) {
- [button setBezelStyle:NSRegularSquareBezelStyle];
- } else {
- if (gadget->h < 24) {
- [button setBezelStyle:NSShadowlessSquareBezelStyle];
- } else {
- [button setBezelStyle:NSRoundedBezelStyle];
- }
- }
- }
- break;
- case GADGET_SLIDER:
- switch (gadget->style&12){
- case SLIDER_SCROLLBAR:
- if (gadget->style & SLIDER_HORIZONTAL)
- rect.size.height=[NSScroller scrollerWidth];
- else
- rect.size.width=[NSScroller scrollerWidth];
- break;
- }
- }
- [[view superview] setNeedsDisplayInRect:[view frame]];
- [view setFrame:rect];
- [view setNeedsDisplay:YES];
- }
- void NSRemoveColor(nsgadget *gadget){
- switch (gadget->internalclass){
- case GADGET_BUTTON:
- if ([[gadget->handle cell] respondsToSelector:@selector(setDrawsBackground)]){
- [[gadget->handle cell] setDrawsBackground:false];
- }
- break;
- case GADGET_WINDOW:
- [gadget->handle setBackgroundColor:nil];
- [gadget->handle display];
- break;
- case GADGET_LABEL:
- if((gadget->style&3)==LABEL_SEPARATOR) break;
- case GADGET_COMBOBOX:
- case GADGET_TEXTFIELD:
- [gadget->handle setDrawsBackground:false];
- break;
- case GADGET_LISTBOX:
- case GADGET_TREEVIEW:
- case GADGET_PANEL:
- case GADGET_TEXTAREA:
- [gadget->handle setColor:nil];
- break;
- }
- }
- void NSSetColor(nsgadget *gadget,int r,int g,int b){
- NSColor *color;
- color=[NSColor colorWithDeviceRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0];
-
- switch (gadget->internalclass){
- case GADGET_BUTTON:
- if ([[gadget->handle cell] respondsToSelector:@selector(setBackgroundColor)]) [[gadget->handle cell] setBackgroundColor:color];
- break;
- case GADGET_COMBOBOX:
- case GADGET_WINDOW:
- [gadget->handle setBackgroundColor:color];
- [gadget->handle display];
- break;
- case GADGET_LABEL:
- if((gadget->style&3)==LABEL_SEPARATOR) break;
- [gadget->handle setDrawsBackground:YES];
- case GADGET_TEXTFIELD:
- [gadget->handle setBackgroundColor:color];
- break;
- case GADGET_LISTBOX:
- case GADGET_TREEVIEW:
- case GADGET_PANEL:
- case GADGET_TEXTAREA:
- [gadget->handle setColor:color];
- break;
- }
- }
- void NSSetAlpha(nsgadget *gadget,float alpha){
- NSWindow *window;
- PanelView *panel;
-
- switch (gadget->internalclass){
- case GADGET_WINDOW:
- window=(NSWindow*)gadget->handle;
- [window setAlphaValue:alpha];
- break;
- case GADGET_PANEL:
- panel=(PanelView*)gadget->handle;
- [panel setAlpha:alpha];
- break;
- }
- }
- BBString *NSGetUserName(){
- return bbStringFromNSString(CSCopyUserName(true));
- }
- BBString *NSGetComputerName(){
- return bbStringFromNSString(CSCopyMachineName());
- }
- BBString *NSRun(nsgadget *gadget,BBString *text){
- HTMLView *htmlview;
- NSString *script;
- BBString *result;
- result=&bbEmptyString;
- switch (gadget->internalclass){
- case GADGET_HTMLVIEW:
- htmlview=(HTMLView*)gadget->handle;
- script=NSStringFromBBString(text);
- script=[htmlview stringByEvaluatingJavaScriptFromString:script];
- result=bbStringFromNSString(script);
- break;
- }
- return result;
- }
- void NSSetText(nsgadget *gadget,BBString *data){
- NSString *text;
- NSMutableDictionary *textAttributes;
- NSMutableParagraphStyle *parastyle;
- NSAttributedString *attribtext;
- NSObject *nsobject;
-
- attribtext=nil;
-
- if(data == nil) data=&bbEmptyString;
-
- text=NSStringFromBBString(data);
-
- nsobject=(NSObject*)gadget->handle;
-
- //printf("data->length: %d\n",data->length);fflush(stdout);
-
- switch (gadget->internalclass){
- case GADGET_TEXTAREA:
- [nsobject setText:text];
- break;
- case GADGET_HTMLVIEW:
- [nsobject setAddress:text];
- break;
- case GADGET_LABEL: /* BaH */
- switch (gadget->style&3) {
- case LABEL_SEPARATOR:
- return;
- default:
- [nsobject setStringValue:text];
- return;
- }
- break;
- case GADGET_BUTTON:
-
- //if ([nsobject respondsToSelector:@selector(setAttributedTitle)] /*&& [nsobject respondsToSelector:@selector(font)]*/){
-
- // Create attribute dictionary (autorelease'd)
- textAttributes=[NSMutableDictionary dictionary];
-
- // Font
- [textAttributes setObject: [nsobject font] forKey:NSFontAttributeName];
-
- // Paragraph style
- parastyle=[[NSMutableParagraphStyle alloc] init];
- [parastyle setParagraphStyle:[NSParagraphStyle defaultParagraphStyle]];
-
- if(gadget->internalclass == GADGET_BUTTON){
- if(((gadget->style & BUTTON_PUSH) == BUTTON_PUSH) ||
- (((gadget->style & 7) != BUTTON_RADIO) &&
- ((gadget->style & 7) != BUTTON_CHECKBOX)))
- [parastyle setAlignment:NSCenterTextAlignment];
- }
-
- [textAttributes setObject: parastyle forKey:NSParagraphStyleAttributeName];
- [parastyle release];
-
- // Text color
- if(gadget->textcolor) [textAttributes setObject: gadget->textcolor forKey: NSForegroundColorAttributeName];
-
- // Underline / strikethrough
- [textAttributes setObject: [NSNumber numberWithInt:0] forKey: NSUnderlineStyleAttributeName];
- [textAttributes setObject: [NSNumber numberWithInt:0] forKey: NSStrikethroughStyleAttributeName];
-
- if ((gadget->intFontStyle&FONT_UNDERLINE)!=0) [textAttributes setObject: [NSNumber numberWithInt:(NSUnderlineStyleSingle|NSUnderlinePatternSolid)] forKey: NSUnderlineStyleAttributeName];
- if ((gadget->intFontStyle&FONT_STRIKETHROUGH)!=0) [textAttributes setObject: [NSNumber numberWithInt:(NSUnderlineStyleSingle|NSUnderlinePatternSolid)] forKey: NSStrikethroughStyleAttributeName];
-
- // Create attibuted text
- attribtext=[[NSAttributedString alloc] initWithString: text attributes: textAttributes];
-
- [nsobject setAttributedTitle:attribtext];
- break;
- //}
- case GADGET_MENUITEM:
- [nsobject setTitle:text];
- // Required otherwise root window menus aren't updated.
- [[nsobject submenu] setTitle:text];
- break;
- case GADGET_PANEL:
- case GADGET_NODE:
- case GADGET_WINDOW:
- [nsobject setTitle:text];
- break;
- case GADGET_COMBOBOX:
- if(!(gadget->style & COMBOBOX_EDITABLE)) break;
- case GADGET_TEXTFIELD:
- [nsobject setStringValue:text];
- break;
- }
- }
- BBString *NSGetText(nsgadget *gadget){
-
- NSObject *nsobject;
- BBString *result;
- result=&bbEmptyString;
- nsobject=(NSObject*)gadget->handle;
-
- switch (gadget->internalclass){
- case GADGET_TEXTAREA:
- result=bbStringFromNSString([[nsobject storage] string]);
- break;
- case GADGET_TEXTFIELD:
- case GADGET_COMBOBOX:
- result=bbStringFromNSString([nsobject stringValue]);
- break;
- case GADGET_HTMLVIEW:
- result=bbStringFromNSString([nsobject address]);
- break;
- case GADGET_NODE:
- result=bbStringFromNSString([nsobject value]);
- break;
- case GADGET_LABEL: /* BaH */
- switch (gadget->style&3) {
- case 0:
- case LABEL_FRAME:
- case LABEL_SUNKENFRAME:
- result=bbStringFromNSString([nsobject stringValue]);
- }
- break;
- case GADGET_PANEL:
- case GADGET_WINDOW:
- case GADGET_BUTTON:
- case GADGET_MENUITEM:
- result=bbStringFromNSString([nsobject title]);
- break;
- }
- return result;
- }
- int NSCharWidth(NSFont *font,int charcode){
- NSSize size=[font advancementForGlyph:charcode];
- return (int)size.width;
- }
- void NSSetFont(nsgadget *gadget,NSFont *font){
- NSView *view;
-
- view=(NSView*)gadget->handle;
-
- switch (gadget->internalclass){
- case GADGET_LABEL:
- if ((gadget->style&3)==LABEL_SEPARATOR) break;
- case GADGET_BUTTON:
- [view setFont:font];
- NSSetText(gadget,NSGetText(gadget)); //Apply underline/strikethough formatting as attributed text in NSSetText().
- break;
- case GADGET_LISTBOX:
- case GADGET_TREEVIEW:
- case GADGET_COMBOBOX:
- case GADGET_TEXTAREA:
- case GADGET_TEXTFIELD:
- case GADGET_TABBER:
- [view setFont:font];
- break;
-
- }
- }
- BBString * NSGetTooltip(nsgadget *gadget){
- BBString *result;
- NSView *view;
-
- result=&bbEmptyString;
- view=(NSView*)gadget->handle;
-
- if(view) result=bbStringFromNSString([view toolTip]);
-
- return result;
- }
- int NSSetTooltip(nsgadget *gadget,BBString *data){
-
- NSString *text;
- NSView *view;
-
- view =(NSView*)gadget->handle;
- text=NSStringFromBBString(data);
-
- if(view){
- [view setToolTip:text];
- return 1;
- }
-
- return 0;
- }
- // gadgetitem commands
- void NSClearItems(nsgadget *gadget)
- {
- ListView *listbox;
- NSControl *combo;
- NSTabView *tabber;
- Toolbar *toolbar;
- NSToolbarItem *item;
- NSArray *items;
- int i,n;
-
- switch (gadget->internalclass){
- case GADGET_LISTBOX:
- listbox=(ListView*)gadget->handle;
- [listbox clear];
- break;
- case GADGET_COMBOBOX:
- combo=(NSControl*)gadget->handle;
- [combo removeAllItems];
- break;
- case GADGET_TABBER:
- tabber=(NSTabView*)gadget->handle;
- items=[tabber tabViewItems];
- n=[tabber numberOfTabViewItems];
- for (i=0;i<n;i++) [tabber removeTabViewItem:[tabber tabViewItemAtIndex:0]];
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- items=[toolbar items];
- n=[items count];
- for (i=0;i<n;i++) [toolbar removeItemAtIndex:0];
- break;
- }
- }
- void NSAddItem(nsgadget *gadget,int index,BBString *data,BBString *tip,NSImage *image,BBObject *extra){
- NSString *text,*tiptext;
- NSControl *combo;
- NSTabView *tabber;
- TabViewItem *tabitem;
- ListView *listbox;
- Toolbar *toolbar;
- NSToolbarItem *item;
- text=NSStringFromBBString(data);
- tiptext=NSStringFromBBString(tip);
- switch (gadget->internalclass){
- case GADGET_LISTBOX:
- listbox=(ListView*)gadget->handle;
- [listbox addItem:text atIndex:index withImage:image withTip:tiptext withExtra:extra];
- break;
- case GADGET_COMBOBOX:
- combo=(NSControl*)gadget->handle;
- [combo insertItemWithObjectValue:text atIndex:index];
- // [[combo itemAtIndex:index] setImage:image];
- break;
- case GADGET_TABBER:
- tabber=(NSTabView*)gadget->handle;
- tabitem=[[TabViewItem alloc] initWithIdentifier:text];
- [tabitem setLabel:text];
- [tabitem setImage:image];
- [tabber insertTabViewItem:tabitem atIndex:index];
- [tabitem release];
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- if (image==0){
- int v;
- Gestalt('sysv',&v);
- if(v>=0x1070){
- [toolbar insertItemWithItemIdentifier:NSToolbarSpaceItemIdentifier atIndex:index];
- }else{
- [toolbar insertItemWithItemIdentifier:NSToolbarSeparatorItemIdentifier atIndex:index];
- }
- [toolbar setSeparatorAtIndex:index];
- }
- else{
- item=[[NSToolbarItem alloc] initWithItemIdentifier:text];
- [item setImage:image];
- // [item setLabel:text];
- [item setAction:@selector(iconSelect:)];
- [item setTarget:GlobalApp];
- [item setToolTip:tiptext];
- [item setTag:0];
- [GlobalApp addToolbarItem:item];
- [toolbar setToolbarItem:item atIndex:index];
- [toolbar insertItemWithItemIdentifier:text atIndex:index];
- }
- break;
- }
- }
- NSToolbarItem *FindToolbarItem(NSToolbar *toolbar,int index){
- return (NSToolbarItem*)[[toolbar items] objectAtIndex:index];
- }
- void NSSetItem(nsgadget *gadget,int index,BBString *data,BBString *tip,NSImage *image,BBObject *extra){
- NSString *text,*tiptext;
- NSControl *combo;
- NSTabView *tabber;
- TabViewItem *tabitem;
- ListView *listbox;
- Toolbar *toolbar;
- NSToolbarItem *item;
- text=NSStringFromBBString(data);
- tiptext=NSStringFromBBString(tip);
- switch (gadget->internalclass){
- case GADGET_LISTBOX:
- listbox=(ListView*)gadget->handle;
- [listbox setItem:text atIndex:index withImage:image withTip:tiptext withExtra:extra];
- break;
- case GADGET_COMBOBOX:
- combo=(NSControl*)gadget->handle;
- [combo removeItemAtIndex:index];
- [combo insertItemWithObjectValue:text atIndex:index];
- // [[combo itemAtIndex:index] setImage:image];
- break;
- case GADGET_TABBER:
- tabber=(NSTabView*)gadget->handle;
- tabitem=(TabViewItem*)[tabber tabViewItemAtIndex:index];
- [tabitem setLabel:text];
- [tabitem setImage:image];
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- item=FindToolbarItem(toolbar,index);
- if (item) {
- // [item setLabel:text];
- [item setImage:image];
- [item setToolTip:tiptext];
- [item setTag:0];
- }
- break;
- }
- }
- void NSRemoveItem(nsgadget *gadget,int index){
- ListView *listbox;
- NSControl *combo;
- NSTabView *tabber;
- TabViewItem *tabitem;
- Toolbar *toolbar;
- switch (gadget->internalclass){
- case GADGET_LISTBOX:
- listbox=(ListView*)gadget->handle;
- [listbox removeItemAtIndex:index];
- break;
- case GADGET_COMBOBOX:
- combo=(NSControl*)gadget->handle;
- [combo removeItemAtIndex:index];
- break;
- case GADGET_TABBER:
- tabber=(NSTabView*)gadget->handle;
- tabitem=(TabViewItem*)[tabber tabViewItemAtIndex:index];
- [tabber removeTabViewItem:tabitem];
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- [toolbar removeItemAtIndex:(int)index];
- break;
- }
- }
- void NSSelectItem(nsgadget *gadget,int index,int state){
- NSControl *combo;
- NSTabView *tabber;
- ListView *listbox;
- Toolbar *toolbar;
- NSToolbarItem *item;
- switch (gadget->internalclass){
- case GADGET_LISTBOX:
- listbox=(ListView*)gadget->handle;
- if(state) [listbox selectItem:index]; else [listbox deselectItem:index];
- break;
- case GADGET_COMBOBOX:
- combo=(NSControl*)gadget->handle;
- [combo setDelegate:nil];
- [combo selectItemAtIndex:index];
- [combo setObjectValue:[combo objectValueOfSelectedItem]];
- [combo setDelegate:GlobalApp];
- break;
- case GADGET_TABBER:
- tabber=(NSTabView*)gadget->handle;
- [tabber selectTabViewItemAtIndex:index];
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- item=FindToolbarItem(toolbar,index);
- BOOL enable=(state&STATE_DISABLED)?false:true;
- [item setEnabled:enable];
- int pressed=(state&STATE_SELECTED)?1:0;
- [item setTag:pressed];
- break;
- }
- }
- int NSSelectedItem(nsgadget *gadget,int index){
- NSComboBox *combo;
- NSTabView *tabber;
- ListView *listbox;
- Toolbar *toolbar;
- NSToolbarItem *item;
- int state;
- state=0;
- switch (gadget->internalclass){
- case GADGET_LISTBOX:
- listbox=(ListView*)gadget->handle;
- if ([[listbox table] selectedRow]==index) state|=STATE_SELECTED;
- break;
- case GADGET_COMBOBOX:
- combo=(NSControl*)gadget->handle;
- if ([combo indexOfSelectedItem]==index) state|=STATE_SELECTED;
- break;
- case GADGET_TABBER:
- tabber=(NSTabView*)gadget->handle;
- if ([tabber indexOfTabViewItem:[tabber selectedTabViewItem]]==index) state|=STATE_SELECTED;
- break;
- case GADGET_TOOLBAR:
- toolbar=(Toolbar*)gadget->handle;
- item=FindToolbarItem(toolbar,index);
- if (![item isEnabled]) state|=STATE_DISABLED;
- if ([item tag]!=0) state|=STATE_SELECTED;
- break;
- }
- return state;
- }
- // treeview commands
- int NSCountKids(nsgadget *gadget){
- TreeView *treeview;
- NodeItem *node;
- switch (gadget->internalclass){
- case GADGET_TREEVIEW:
- treeview=(TreeView*)gadget->handle;
- return [treeview count];
- case GADGET_NODE:
- node=(NodeItem*)gadget->handle;
- return [node count];
- }
- return 0;
- }
- int NSSelectedNode(nsgadget *gadget){
- TreeView *treeview;
- switch (gadget->internalclass){
- case GADGET_TREEVIEW:
- treeview=(TreeView*)gadget->handle;
- return (int)[treeview selectedNode];
- }
- return -1;
- }
- // textarea commands
- int LinePos(NSString *text,int pos){
- int line,i;
- line=0;
- for (i=0;i<pos;i++) {if ([text characterAtIndex:i]=='\n') line++;}
- return line;
- }
- int CharPos(NSString *text,int line){
- int pos,n;
- pos=0;
- n=[text length];
- while (pos<n && line>0){
- if ([text characterAtIndex:pos]=='\n') line--;
- pos++;
- }
- return pos;
- }
- NSRange GetRange(NSTextStorage *storage,int pos,int count,int units){
-
- NSString *text;
- unsigned int max;
-
- if (units==TEXTAREA_LINES){
- text=[storage string];
- if (count==TEXTAREA_ALL)
- count=[storage length];
- else
- count=CharPos(text,pos+count);
- pos=CharPos(text,pos);
- max=[storage length]-pos;
- count-=pos;
- }
- else{
- max=[storage length]-pos;
- if (count==TEXTAREA_ALL) count=max;
- }
-
- if (count > max) count=max;
- if (count<0) count=0;
-
- //NSLog(@"GetRange() pos: %d,count: %d,length: %d\n",pos,count,[storage length]);
-
- return NSMakeRange(pos,count);
-
- }
- void NSReplaceText(nsgadget *gadget,int pos,int count,BBString *data,int units){
- NSString *text;
- TextView *textarea;
- NSRange range,snap;
- NSTextStorage *storage;
- unsigned int size;
-
- text=NSStringFromBBString(data);
- textarea=(TextView*)gadget->handle;
-
- if(([[textarea string] length] == 0) || ((pos == 0) && (count == TEXTAREA_ALL))){
-
- [textarea setText:text];
-
- } else {
-
- snap=[textarea selectedRange];
- range=GetRange([textarea storage],pos,count,units);
- storage=[textarea storage];
- [storage replaceCharactersInRange:range withString:text];
- size=[storage length];
- if (snap.location>size) snap.location=size;
- if (snap.location+snap.length>size) snap.length=size-snap.location;
- [textarea setSelectedRange:snap];
-
- }
-
- }
- void NSAddText(nsgadget *gadget,BBString *data){
- NSString *text;
- TextView *textarea;
- NSRange range;
- text=NSStringFromBBString(data);
- textarea=(TextView*)gadget->handle;
- [textarea addText:text];
- range=GetRange([textarea textStorage],[[textarea string] length],0,0);
- [textarea setSelectedRange:range];
- [textarea scrollRangeToVisible:range];
- }
- BBString *NSAreaText(nsgadget *gadget,int pos,int length,int units){
- TextView *textarea;
- NSRange range;
- NSAttributedString *astring;
- BBString *bstring;
- textarea=(TextView*)gadget->handle;
- range=GetRange([textarea storage],pos,length,units);
- astring=[[textarea storage] attributedSubstringFromRange:range];
- bstring=bbStringFromNSString([astring string]);
- return bstring;
- }
- int NSAreaLen(nsgadget *gadget,int units){
- TextView *textarea;
- NSTextStorage *storage;
- unsigned ulen;
- textarea=(TextView*)gadget->handle;
- storage=[textarea storage];
- ulen=[storage length];
- if (units==TEXTAREA_LINES) ulen=LinePos([storage string],ulen)+1;
- return ulen;
- }
- void NSSetSelection(nsgadget *gadget,int pos,int length,int units){
- TextView *textarea;
- NSRange range;
- textarea=(TextView*)gadget->handle;
- range=GetRange([textarea textStorage],pos,length,units);
- [textarea setSelectedRange:range];
- if(!textarea->lockedNest) [textarea scrollRangeToVisible:range];
- }
- void NSLockText(nsgadget *gadget){
- TextView *textarea;
- textarea=(TextView*)gadget->handle;
-
- if(!textarea->lockedNest){
- textarea->lockedRange=[textarea rangeForUserTextChange];
- [textarea->storage beginEditing];
- }
- ++textarea->lockedNest;
- }
- void NSUnlockText(nsgadget *gadget){
- TextView *textarea;
-
- textarea=(TextView*)gadget->handle;
-
- --textarea->lockedNest;
- if(!textarea->lockedNest){
- NSRange range=textarea->lockedRange;
- [textarea->storage endEditing];
- if(range.location+range.length>[textarea->storage length]) range=NSMakeRange(0,0);
- [textarea setSelectedRange:range];
- }
- }
- void NSSetTabs(nsgadget *gadget,int tabwidth){
- TextView *textarea;
- textarea=(TextView*)gadget->handle;
- [textarea setTabs:tabwidth];
- }
- void NSSetMargins(nsgadget *gadget,int leftmargin){
- TextView *textarea;
- textarea=(TextView*)gadget->handle;
- [textarea setMargins:leftmargin];
- }
- int NSCharAt(nsgadget *gadget,int line){
- TextView *textarea;
- NSString *text;
- int n,i;
- textarea=(TextView*)gadget->handle;
- text=[[textarea storage] string];
- n=[text length];i=0;
- while (line){
- if (i==n) break;
- if ([text characterAtIndex:i]=='\n') line--;
- i++;
- }
- return i;
- }
- int NSLineAt(nsgadget *gadget,int pos){
- TextView *textarea;
- textarea=(TextView*)gadget->handle;
- return LinePos([[textarea storage] string],pos);
- }
- int NSCharX(nsgadget *gadget,int pos){
- unsigned int rectCount;
- NSRectArray rectArray;
- TextView *textarea=(TextView*)gadget->handle;
- NSRange range=GetRange([textarea textStorage],pos,0,TEXTAREA_CHARS);
- rectArray=[[textarea layoutManager] rectArrayForCharacterRange:range withinSelectedCharacterRange:range inTextContainer: [textarea textContainer] rectCount:&rectCount];
- if(rectCount > 0) return (int)(((NSRect)rectArray[0]).origin.x-([textarea visibleRect].origin.x-[textarea textContainerOrigin].x));
- }
- int NSCharY(nsgadget *gadget,int pos){
- unsigned int rectCount;
- NSRectArray rectArray;
- TextView *textarea=(TextView*)gadget->handle;
- NSRange range=GetRange([textarea textStorage],pos,0,TEXTAREA_CHARS);
- rectArray=[[textarea layoutManager] rectArrayForCharacterRange:range withinSelectedCharacterRange:range inTextContainer: [textarea textContainer] rectCount:&rectCount];
- if(rectCount > 0) return (int)(((NSRect)rectArray[0]).origin.y-([textarea visibleRect].origin.y-[textarea textContainerOrigin].y));
- }
- int NSGetCursorPos(nsgadget *gadget,int units){
- TextView *textarea;
- NSRange range;
- textarea=(TextView*)gadget->handle;
- range=[textarea rangeForUserTextChange];
- if (range.location == NSNotFound) return 0; //KORIOLIS (avoids read-only text-area crash)
- if (units==TEXTAREA_LINES) return NSLineAt(gadget,range.location);
- return range.location;
- }
- int NSGetSelectionlength(nsgadget *gadget,int units){
- TextView *textarea;
- NSRange range;
- textarea=(TextView*)gadget->handle;
- range=[textarea rangeForUserTextChange];
- if (range.location == NSNotFound) return 0; //KORIOLIS (avoids read-only text-area crash)
- if (range.length == 0) return 0;
- if (units == TEXTAREA_LINES){
- int l0=NSLineAt(gadget,range.location);
- int l1=NSLineAt(gadget,range.location+range.length-1);
- return (l1-l0+1);
- }
- return range.length;
- }
- void NSSetTextColor(nsgadget *gadget,int r,int g,int b){
-
- if(gadget->textcolor) [gadget->textcolor release];
- gadget->textcolor=[[NSColor colorWithDeviceRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0] retain];
-
- switch (gadget->internalclass){
- case GADGET_LABEL:
- switch (gadget->style&3) {
- case LABEL_SEPARATOR:
- return;
- }
- case GADGET_TEXTFIELD:
- case GADGET_LISTBOX:
- case GADGET_TREEVIEW:
- case GADGET_TEXTAREA:
- [gadget->handle setTextColor:gadget->textcolor];
- break;
- default:
- NSSetText(gadget,NSGetText(gadget)); //Attempt to reset text with NSAttributedString
- break;
- }
- }
- void NSSetStyle(nsgadget *gadget,int r,int g,int b,int flags,int pos,int length,int units) {
- TextView *textarea;
- NSRange _range;
- NSColor *color;
- int traits=0;
- textarea=(TextView*)gadget->handle;
- _range=GetRange([textarea storage],pos,length,units);
- color=[NSColor colorWithDeviceRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0];
-
- [[textarea storage] removeAttribute:NSLinkAttributeName range:_range];
- [[textarea storage] addAttribute:NSForegroundColorAttributeName value:color range:_range];
- [[textarea storage] addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:(flags & 4)?NSUnderlineStyleSingle:NSUnderlineStyleNone] range:_range];
- [[textarea storage] addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInt:(flags & 8)?NSUnderlineStyleSingle:NSUnderlineStyleNone] range:_range];
- traits |= (flags & 1)?NSBoldFontMask:NSUnboldFontMask;
- traits |= (flags & 2)?NSItalicFontMask:NSUnitalicFontMask;
- [[textarea storage] applyFontTraits: traits range:_range];
- }
- void NSSetValue(nsgadget *gadget,float value){
- NSProgressIndicator *progbar;
- NSDate *date;
- NSValue *info;
- NSRunLoop *runloop;
-
- switch (gadget->internalclass){
- case GADGET_PROGBAR:
- progbar=(NSProgressIndicator*)gadget->handle;
- [progbar setDoubleValue:value];
- break;
- }
- }
- // slider / scrollbar
- void NSSetSlider(nsgadget *gadget,double value,double small,double big){
- NSScroller *scroller;
- NSSlider *slider;
- NSStepper *stepper;
- NSRect frame;
- float size;
-
- switch (gadget->style&12){
- case SLIDER_SCROLLBAR:
- scroller=(NSScroller*)gadget->handle;
- if(value > (big-small))
- value=1.0L;
- else if(big-small)
- value/=(big-small);
- else
- value=0.0L;
- [scroller setKnobProportion:(small/big)];
- [scroller setDoubleValue:value];
- break;
- case SLIDER_TRACKBAR:
- slider=(NSSlider*)gadget->handle;
- [slider setMinValue:small];
- [slider setMaxValue:big];
- [slider setDoubleValue:value];
- break;
- case SLIDER_STEPPER:
- stepper=(NSStepper*)gadget->handle;
- [stepper setMinValue:small];
- [stepper setMaxValue:big];
- [stepper setDoubleValue:value];
- break;
- }
- }
- double NSGetSlider(nsgadget *gadget){
- NSControl *control;
- control=(NSControl*)gadget->handle;
- return [control doubleValue];
- }
- void NSSetPointer(int shape){
- NSCursor *cursor;
- cursor=[NSCursor arrowCursor];
-
- switch (shape){
- // case POINTER_DEFAULT:cursor=[NSCursor ];break;
- case POINTER_ARROW:cursor=[NSCursor arrowCursor];break;
- case POINTER_IBEAM:cursor=[NSCursor IBeamCursor];break;
- // case POINTER_WAIT:cursor=[NSCursor ];break;
- case POINTER_CROSS:cursor=[NSCursor crosshairCursor];break;
- case POINTER_UPARROW:cursor=[NSCursor resizeUpCursor];break;
- // case POINTER_SIZENWSE:cursor=NSCursorCreateStock(curNWSE);break;
- // case POINTER_SIZENESW:cursor=NSCursorCreateStock(curNESW);break;
- // case POINTER_SIZEALL:cursor=NSCursorCreateStock(curSizeAll);break;
- // case POINTER_NO:cursor=NSCursorCreateStock(curNoEntry);break;
- // case POINTER_HELP:cursor=NSCursorCreateStock(curHelp);break;
- case POINTER_SIZEWE:cursor=[NSCursor resizeLeftRightCursor];break;
- case POINTER_SIZENS:cursor=[NSCursor resizeUpDownCursor];break;
- case POINTER_HAND:cursor=[NSCursor pointingHandCursor];break;
- // case POINTER_APPSTARTING:cursor=[NSCursor ];break;
- }
- [cursor set];
- }
- typedef struct bbpixmap bbpixmap;
- struct bbpixmap{
- // BBObject
- void *class;
- int refs;
- // pixmap
- unsigned char *pixels;
- int width,height,pitch,format,capacity;
- };
- #define PF_I8 1
- #define PF_A8 2
- #define PF_BGR888 3
- #define PF_RGB888 4
- #define PF_BGRA8888 5
- #define PF_RGBA8888 6
- #define PF_STDFORMAT PF_RGBA8888
- const static char BytesPerPixel[]={0,1,1,3,3,4,4};
- const static char BitsPerPixel[]={0,8,8,24,24,32,32};
- const static char RedBitsPerPixel[]={0,0,0,8,8,8,8};
- const static char GreenBitsPerPixel[]={0,0,0,8,8,8,8};
- const static char BlueBitsPerPixel[]={0,0,0,8,8,8,8};
- const static char AlphaBitsPerPixel[]={0,0,8,0,0,8,8};
- NSImage *NSPixmapImage(bbpixmap *pix){
- NSImage *image;
- NSBitmapImageRep *bitmap;
- int spp,bpp,i;
- int bytesperrow;
- BOOL alpha;
- unsigned char * data;
-
- alpha=AlphaBitsPerPixel[pix->format]?YES:NO;
- spp=BytesPerPixel[pix->format];
- bpp=BitsPerPixel[pix->format];
- bytesperrow=pix->width*spp;
-
- bitmap=[[[NSBitmapImageRep alloc]
- initWithBitmapDataPlanes:NULL
- pixelsWide:pix->width
- pixelsHigh:pix->height
- bitsPerSample:8
- samplesPerPixel:spp
- hasAlpha:alpha
- isPlanar:NO
- colorSpaceName:NSDeviceRGBColorSpace
- // bitmapFormat:NSAlphaNonpremultipliedBitmapFormat
- bytesPerRow:bytesperrow
- bitsPerPixel:bpp] autorelease];
-
- data=[bitmap bitmapData];
-
- for(i=0; i < pix->height; i++) {
- memcpy(data + (i * bytesperrow),pix->pixels + (i * pix->pitch),bytesperrow);
- }
- image=[[NSImage alloc] initWithSize:NSMakeSize(pix->width,pix->height)];
- [image addRepresentation:bitmap];
- [image retain];
- return image;
- }
- void NSSetImage(nsgadget *gadget,NSImage *image,int flags){
- PanelView *panel;
- NSButton *button;
- NSMenuItem *menu;
-
- switch (gadget->internalclass){
- case GADGET_PANEL:
- panel=(PanelView*)gadget->handle;
- [panel setImage:image withFlags:flags];
- break;
- case GADGET_BUTTON:
- if ((flags & GADGETPIXMAP_ICON) && (gadget->style <= BUTTON_PUSH)){
- button=(NSButton *)gadget->handle;
- [button setImage:image];
- if (flags & GADGETPIXMAP_NOTEXT) {
- [button setImagePosition:NSImageOnly];
- } else {
- [button setImagePosition:NSImageLeft];
- }
- }
- break;
- case GADGET_MENUITEM:
- if (flags & GADGETPIXMAP_ICON){
- menu=(NSMenuItem*)gadget->handle;
- [menu setImage:image];
- }
- break;
- }
- }
- void NSSetIcon(nsgadget *gadget,NSImage *image){
- NodeItem *node;
-
- switch (gadget->internalclass){
- case GADGET_NODE:
- node=(NodeItem*)gadget->handle;
- [node setIcon:image];
- break;
- }
- }
- void NSSetNextView(nsgadget *gadget,nsgadget *nextgadget){
- NSView *view,*nextview;
- view=(NSView*)gadget->handle;
- nextview=(NSView*)nextgadget->handle;
- [view setNextKeyView:nextview];
- }
- static int keyToChar(int key){
- if(key>=KEY_A && key<=KEY_Z) return key-KEY_A+'a';
- if(key>=KEY_F1 && key<=KEY_F12) return key-KEY_F1+NSF1FunctionKey;
-
- switch(key){
- case KEY_BACKSPACE:return 8;
- case KEY_TAB:return 9;
- case KEY_ESC:return 27;
- case KEY_SPACE:return 32;
- case KEY_PAGEUP:return NSPageUpFunctionKey;
- case KEY_PAGEDOWN:return NSPageDownFunctionKey;
- case KEY_END:return NSEndFunctionKey;
- case KEY_HOME:return NSHomeFunctionKey;
- case KEY_UP:return NSUpArrowFunctionKey;
- case KEY_DOWN:return NSDownArrowFunctionKey;
- case KEY_LEFT:return NSLeftArrowFunctionKey;
- case KEY_RIGHT:return NSRightArrowFunctionKey;
- case KEY_INSERT:return NSInsertFunctionKey;
- case KEY_DELETE:return NSDeleteFunctionKey;
- case KEY_TILDE:return '~';
- case KEY_MINUS:return '-';
- case KEY_EQUALS:return '=';
- case KEY_OPENBRACKET:return '[';
- case KEY_CLOSEBRACKET:return ']';
- case KEY_BACKSLASH:return '\\';
- case KEY_SEMICOLON:return ';';
- case KEY_QUOTES:return '\'';
- case KEY_COMMA:return ',';
- case KEY_PERIOD:return '.';
- case KEY_SLASH:return '/';
- }
- return 0;
- }
- void NSSetHotKey(nsgadget *gadget,int key,int modifier){
- int chr;
- unichar uchar[1];
- NSString *keyStr;
- int modMask;
- NSMenuItem *menuItem;
- if(gadget->internalclass!=GADGET_MENUITEM) return;
- modMask=0;
- if(modifier & 1) modMask|=NSShiftKeyMask;
- if(modifier & 2) modMask|=NSControlKeyMask;
- if(modifier & 4) modMask|=NSAlternateKeyMask;
- if(modifier & 8) modMask|=NSCommandKeyMask;
- menuItem=(NSMenuItem*)gadget->handle;
- chr=keyToChar(key);
- if(!chr) {
- [menuItem setKeyEquivalent:@""];
- [menuItem setKeyEquivalentModifierMask:0];
- return;
- }
- uchar[0]=chr;
- keyStr=[NSString stringWithCharacters:uchar length:1];
- [menuItem setKeyEquivalent:keyStr];
- [menuItem setKeyEquivalentModifierMask:modMask];
- }
|