-not a Macintosh disk-DPi`KJDBH@%?QZ26NP"N,L 8!"@$|Gn"`I N.@A,H<( F<B<H111.Bx<kNNF`, 8! "NH@"|J(g g`LNu"_ |a||a0@||9݁g|w|a||NH瀀 |(_@"g2<@gBA?N`Fa`||aPLNu  fBR$N"NBH@&|݁ |B$<0HN~NL@dBgg>N&|)`RNuBBBA*2h/ BBB N _"_$_"H&|݁ |B$<0NNd 0<`L$|J HA H  2I<FFI<<FFfHHFFfHHH?B@L"_2N _0H 2<@I6@o Az:<2`6@oJA~:<26" @n2BDBB(`EB@nAJEkz`z2<HAIL0.NL0.N  / p? O@ 0  0  XO _,_2_!.NBBB/ BBBN08 @ gNu@ f"_E!NH\O/ ?`@&x|N _!@"|xEz En"`CE"|xN"Ҹ< A  33"|@E E4n"`C&E"|@.N _LHNFLN*8&E@<<'CJJKK f`  f `><$CS*<FF4>BRIBC Gff&<CBSC`D GnKG45BQf` f `Ns |0< BXHQ!4 _$_"_!XOHH/8/ $ f0<? QN ! N.x $_$ g ! N.x !C !!LLyp!N\OFN  l0P߀ Aǀ`  6lo6@ 0_an*>]> j 56, l602  ۰Poo A` &ll6p@ 0?۷a?^ ꭕ 5o6, l602 8!ED91kE"0369? CoNGNOS BOOT FAILED TRY A NEWER MACHINE AND BOOT PROM _"_NN/A lNNu _.NHL$ orD?|?@?e\SFk!!QSWk:CL<HL|hH>L|4H>L|H>SWjTO>SGk\!Q`TSFk QSWk8L|H|L|H|4L|H|hL|H|LSGkQLx _O NNVH8=| f=|G* G, &N(N n"n$n 0.  S@ZeJ S@BBDBG S@gg.BC CJDg720faL`fa:` 320f8<S@`JDg  fa$` fa`  U@o$SBjt`(N&N><`JGg (Ev#$#$QNukJDg`g 3$f(N`BnLN^ _NUNPACK H>8$O&j.(j4,*8:*,BB6*2SCCn`8CL0@D@04"F K0HEY@2< Vb,g`aJaBVgbHE6SCCo`p`HE4RBCo8B@ j(0 j$L| _pN am znNu _"_$_$0H2< @`Q`BQBNNV;n *N^.NuEVINIT NVH,. ^J]g n0`4B?N. f n0`/.//. /.N6(n)FLN^ _NEAD_BLONV/ (n Jno./.?././ /.Nj nJPg`RSn`(_N^ _NEAD_SEQHNT"|E.|r |BBByBygRBf~NuLHPPNqNqpS_n.0<QLHPPNqNqpS_n|~By&JM*Np|azJGfb|a|,Mpa`JGfH|a<<AaJGf0Avtp BQvr BQH@02N\LhL"4NtB@6Kd a"JDf`02IP g a JDf`Nub SBg pxNuBDNu><Nu4< vB@bp2IPSCfSBfNuppB@(4<dBC(4< CBC(C"H4<BACSBf(CAg><NuJoNV?-,N.H|)?NN^ _TONRAP NV.HgVS@g`J.f& -`мS//<N/<NB+_`-m` . ѭ` -`o<Np`B . \J.f/-\/<N4/<N+_\-m\ -\l<N,N^ _PONGETSPACNV .мS//<N/<N-_ .=@ N^.NuINDSPARNVH.. Bg/N0Hހ m0.@I/./<N 8//<Np @n ?.Bg?<BgNLN^ _ NETMMU NVH+| d+|l+|(+||+|+|t+|(|;TV(|;T|(|.;Tz&| n!SLN^.NuETVARS NVH/Nt;| .䐼/+@ .м/м+@+|`*<(< E"D +@\&|?-|0-VS?NHnHmJNJngp+@JBBg/-BgNz+_ -Э+@XBB<0<H/BgNPN+_P+mPBG` m @I G~V GTVgd Gl|p@ @8`$ Gf|p@BT`| p@BT H< @"@=A?.??<BgNRG Gox mI|p@BT mIP|p@/-P/<N* 8LN^NuOOTINITNVH(nB BgNBgNHH,BgN0HѬ f,/, N"BgNBgNHH,BgN0HѬ f,/, NBgNrBgNjHH,BgN0HѬ f:Jf< N/, NBgN2BgN*HH,BgNb0HѬ g<NLBN,BN+_ n/BN|  _r Ё0p//-`N/-/-`N&m`:=E E0o<N0<H+@l+| -lЭd n2HҀ -Ё"-Ҁ(Bg Э/N0Hѭ -Є+@B</-BgN+_+mh -dЭh+@p -lЭp, n0HІ+@ -Э+@ -Э+@?<f/-/-?<Nb-m/ /./-N n LN^ _ NUILD_SYNVH(nBGBF. gB `P-n n0. PoB."` n0. A-H&n/+/<N  n0>+<+/, NBgN<BgN4HH-@BgNj0H(٬ JVJ_gB."`4JGW WJGV WgJFf n `H n n/B."n/BgN2  _ BNB-_JGf n Q/ n P/Nr` Q@H/ n P/NZ|B. n=h-nA-H n-P/./.p/N JGgR-mBg n/( n r Ё/ n P/ nP/ | ? Q@?N9_Jlg< N, nQ f|"LN^ _NOADSEG NVHBBg/-tBgN+_x -x"-Ҁ+At(|`p}//<Nn -Пx((|p}//<NN -Пx(?<}/-x/-t?<N&|BSLN^.NuLLOC_SCNVHAC 0BgHnNz_m+m-gBBg/-BgNP+_`+m-gBBg/<BgN, м,BgBgBHnBgHnHnBg/.N g<NACD 0BgHnN  g B-n`.BgBgBHnBgHnHnBg/.Nx g<Nf .@+@ -Э+@` B -@+@ -м@+@?</-/-?<N@ <逐.JfB` .ЇP-@JfB` .ЇP-@-g -Ї/ -Ї//./.N`/-/-BBN(|p((|t(LN^.NuOAD_DEB SYSTEM.DEBUG2 SYSTEM.DEBUGNVH nCJp"S@n2&n (nBBgHnN dgZB /, N NBgN BgN HH(BgN0H* f&.B</BgN&B /, N //NlLN^ _ NOAD_UNPNVBgBgBHn</. /.Bg/.N g<NN^ _ NOAD_LLDNVH(n 0-N|>Jg,, .* Ю(H//<N( Д-@`,.(.H//<N-_?//?<N. .P/NdLN^ _NNSTALL_NVH(n=n ~`/, N BgN p_BgN fHH(BgN 0H-@Jg .Ѭ `<N~ .fBN (BN ( GfAB0pB5pB`ACZ 0z`BgN _ .ARE EoHn?<?<HnNAC 0HnHzNg(AB0pp @AB @AB`2HnHzNPgAB0pB5pB`App| 5pgnBg?/.Hn @AHp @AHp</.NX g<NF?. @A/0 @A"0Ҽ/?<NHRGinoLLN^ _ NOADCODEkrni NVBBg/-BgN+_?<e/-/-?<NN^.NuAKESUPSNVH(m . R A T&@-kLN^ _ NINDMAINNVBg/-NF0HѭB</-BgNx+_?<g/-/-?<N\Bg/-|N 0Hѭ|B</-|BgN>+_?<{/-/-|?<N"N^.NuLLOC_OPNV A0C ArC 0AC 0/NLHnHm/NFBgHn0N g< NHnHn/NBgHnrN g<N^/NZBg/.Hn$/N;_N/./.Hm/N-UgNj/.$?-N/N@/N2 n /B/.$0-NH//NR  _ /NBNj+_N^ _PONOADSYS $ SYSTEM.UNPACK SYSTEM.OS SYSTEM.LLDN :NV,_NUvN ,+|v mv PVD@UNHmHmNHm?- -|Э//-NzNZN N]N NuN^NuOADER NVHAv(HA^&HHn?-.0-0H".Ҁ// / NrJng<NLN^.NuEAD_PAGNV0.HBH"-DҀ-A0.HBH@J@=@/.NvAv0.HЈ-@ N^ _TONIND_SENNVBH nCJp"S@n2 n BBgA/A/Nz-m2Av(H&L U.=m6B|`A^-HHAv(BE`:HnN?-.0-0H".ҀH҅///.HNhؼJnNg<NRE Eom6l^Bn So4 X/ U/0S@?A/?<$Hn/. N n gRn G0.D@@20HҌ-A n-P`/ /?A/?<$Hn/. NRFinBo$ n g< G0.D@@20HҌ-A/.HnP?<NN n/B?.vN4  _ LN^ _ ND_SEARCNVH n-h .S/0-:H/N ;@Z-n p+@V;m:\BF` AvIBBlRF Fo=mHnNBgHn?->N>H/p6/NNZBp6/A/NACp S@n0HnN^J.gHHnHnN .Wgz n/B?.N  _ `SFRGm>fBGBNJFfELN^ _PONOOKUP_ENVH.<A"G";n .;m.,?.?-.N;n0BN&Av(HJg<NH;l~:+lD;lB;l>;l@;l<;T8;l26+l.2 2f<N m8lB?,N&_+SH+kL+kPLN^.NuNITMEDINV m8lBg/.HnN2_`/.HnHnNn .gB/.N-_N^.NuPENINPUNVH(.BGBF Go<NR Av:0JEf<N8 EHl@ AvH"Ұ n n Jf<NHH " n ``RGE`LN^ _ NIND_POSNV-mV/.0-:H/N+_VJV]2-ZHV]g<N0-:H/-V/N2 .;@\ -Vg/-VHnHnN/.N"N^.NuILLBUF NV0-\m:f -VR2-:H//NNT0-\AvpRm\N^NuETBYTE NVHBgNHH<BgNH>JGl H м> G=@LN^NuETWORD NVHBgN0H//<ND,BgN0H.Jl޼ Ї-@LN^NuETLONG NVH,. 0-:m\>HǼl>JGo0-\AvA//.H/NH߮Hǜm\0-:HnJV]2-ZHV]g<N -VR/HnHnNn-nA^(H/0-:H/N*l-EJoZHn?-.0-0H".Ҁ/?././ NjJng<N~0-:H/./N(ٮ .Ѯ .ѭV`:Jo -VR2-:H//NNhJfLN^ _PONOVEMULTNVH(n0,k @nH0;N *6BN\BgHlN_`n/,N`dBgN_`XBgN9_`LBN)_`@/,/,N:`2&l.,/ ?-.0-0H", Ҁ/?,/ /NP`<NhLN^.NuRIVER_C//0/2/ AH@B@2/Ё/@" /WXNuNV// /"/N:/A" N^/WXNuNV// /"/N/@" N^/WXNuH>*jD,jD$HBJBf6B@H@g4HB04"B@H@`$&BBxԂрҁmRQJjDjDL|NuNuNuJoNu$_0 _"_J @o4$ Tg,2ABAgSBgS@2@ISA QS@kQN$_0 _"_J`!QN$_02 _`QNHBB oJ0/2/gk gRBSAn` R gSBRAk?B/oL\NuHBB oJ0/2/gk fRBSAn` R fSBRAk?B/oL\NuHr`HBA oJ"oJB@f`fQ AA/oL\NuH"o J oJv`:H"o J oJBC`&H o J"oJv`H o J"oJBCB@BA@m4`4`fQ@n C`cC"/oL\NuH0/ oC"4JBAR`$aJBBB`QQ oC"0/H#//IL._NuH oJB@BA"o JBBBlBA`$HR` fQ`RS@`?A"/oL\NuH o0/2/SA"o JBBA@m`Q/o L NuB`$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoN$_0"_ _J/ S@m*BABB@m6B$I”@`!Q`QNuKb? TK Sources 22at file(s)? JoNV̆^KY :a$ kT \k\:)$ "#." #"##%& ! . Mt  e4 wX$F.1 .1m$LIBTK/UABC5.TEXT}LStt$libtk/UDIALOG.TEXTL$libtk/UDIALOG2.TEXTɝL44$libtk/UDIALOG3.TEXTpLІ$libtk/UDIALOG4.TEXT ؜$libtk/UDRAW.TEXT j\XX$libtk/Udraw2.TEXT K ount.OBJi.8$TOOLS/concat.OBJmCS.8$TOOLS/copy.OBJhڷ.8$TOOLS/find.OBJnܚܮ((.8$tools/help.texts 8` $TOOLS/linecount.OBJk۞ۮ.8$TOOLS/lwccount.OBJl.8$TOOLS/translit.OBJo"".8$TOOLS/wordcount.OBJjP`.8$Transfer.Obja"DDj$Transfer/config.texty, $TTY/TERM.MENUS.TEXTzWY7v g $ubaudrate.Text} $ucsdeditor.OBJsϾ$UXref.OBJXМDD.8$WORKSHOP.STEP.HELP.TEXT?Z3Z:N$WORKSHOPERRS.ERRƜ$xref.help.textay|$xref.OBJ`zؚzz.8${T11}buttons#${T11}obj*{(${T11}PHRASEsX)*(jj@@@@@@NNLIBTK/UABC5.TEXTTEXTXTEXT^ _PONНKbI}\LSNV n  Mlibtk/UDIALOG.TEXTTEXTUhKbJ\LNV n V Vlibtk/UDIALOG2.TEXTTEXTUhKbKɝ\LNV n  elibtk/UDIALOG3.TEXTTEXTUhKbLp\LІNV n x xlibtk/UDIALOG4.TEXTTEXTUhKbM؝\NV n J wJlibtk/UDRAW.TEXTTEXTEXTUhKbNj\\NV n , ,libtk/Udraw2.TEXTTEXTXTUhKbOK K"NV n Z <3. "6F^9 SD!$ǐ^- - iLH} THEN VAR icon: TEnumIcons): BOOLEAN}; roller}; t): TPane}; !}}%!HnHz~Hn?. 8. %bcLbLjLj'̓. L ^V0BEGIN 0DownAt := TRUE; 0scroller := POINTER(RefconSb(hsbHit)); 0icon := iconAlias.abc; 0END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TScrollBar.}Draw; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF SELF.i{INCLUDE FILE UABC5 -- IMPLEMENTATION OF UABC} {Copyright 1983, 1984, Apple Computer, Inc.} 4{TPanel-TBand-TPane-TMarginPad-TBodyPad-TScroller-TScrollBar} {changed 05/11/84 11:25 In TPanel.MoveSplitBefore, if we are creating a new split check the new band's  SELF.view THEN ,Free(SELF.currentView); (FOR vhs := v TO h DO ,BEGIN ,SELF.bands[vhs].Free; ,SELF.scrollBars[vhs].Free; ,END; (SELF.panes.Free; (Free(SELF.deletedSplits); (TArea.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TPanel.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN (TArea.Fields(Field); (Field('window: TWindow'); (Field('panes: TList'); (Field('currentView: TView'); (Field('view: TView'); (Field('paginatedView: TPaginatedView'); (Field('selection: TSelection'); (Field('undoSelection: TSelection'); (Field('bands: ARRAY [0..1] OF TList'); (Field('scrollBars: ARRAY [0..1] OF TScrollBar'); (Field('abilities: ARRAY [0..1] OF Byte'); (Field('minInnerDiagonal: Point'); (Field('resizeBranch: TBranchArea'); (Field('zoomed: BOOLEAN'); (Field('zoomFactor: RECORD numerator: Point; denominator: Point END'); (Field('previewMode: Byte'); (Field(''); (Field('lastClick: RECORD gotPane: BOOLEAN; clickPane: TPane; END'); (Field('contentRect: Rect'); (Field('tlSideBandSize: Point'); (Field('brSideBandSize: Point'); (Field('deletedSplits: TArray'); (Field(''); $END; ${$S SgABCres} ${$ENDC} ${$S sRes} $PROCEDURE {TPanel.}AutoScroll{(mousePt: Point)}; (VAR vhs: VHSelect; ,mouseCd: INTEGER; ,f: INTEGER; ,deltaLPt: LPoint; ,pane: TPane; ,r: Rect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.currentView.GetStdScroll(deltaLPt); (FOR vhs := v TO h DO ,BEGIN ,mouseCd := mousePt.vh[vhs]; ,IF NOT (aScroll IN SELF.abilities[vhs]) THEN 0f := 0 ,ELSE ,IF mouseCd < SELF.contentRect.topLeft.vh[vhs] THEN {+++ LSR +++} 0f := -1 ,ELSE ,IF mouseCd > SELF.contentRect.botRight.vh[vhs] THEN {+++ LSR +++} 0f := 1 ,ELSE 0f := 0; ,deltaLPt.vh[vhs] := f * deltaLPt.vh[vhs]; ,END; ({Find the pane to scroll; make sure it is not in a side band} (r := SELF.contentRect; (InsetRect(r, 1, 1); {Because the outerRects of a side band's panes overlap the contentRect by 1 pixel; @(ChildWithPt checks the outerRect)} (RectHavePt(r, mousePt); (pane := TPane(SELF.ChildWithPt(mousePt, SELF.panes, mousePt)); (pane.ScrollBy(deltaLPt); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $PROCEDURE {TPanel.}BeginSelection; {+SW+} (VAR thisWindow: TWindow; ,companionWindow: TWindow; (PROCEDURE DeselPanel(obj: TObject); (BEGIN ,TPanel(obj).selection.Deselect; (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.BeSelectPanel(TRUE); (thisWindow := SELF.window; (companionWindow := NIL; (IF thisWindow = currentWindow THEN ,companionWindow := thisWindow.dialogBox {+SW+} (ELSE (IF thisWindow = currentWindow.dialogBox THEN ,IF currentWindow.dialogBox.downInMainWindowResponse = diGiveToMainWindow THEN 0companionWindow := currentWindow; (IF companionWindow <> NIL THEN ,BEGIN ,PushFocus; ,companionWindow.Focus; ,companionWindow.panels.Each(DeselPanel); ,PopFocus; ,END; (thisWindow.panels.Each(DeselPanel); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $PROCEDURE {TPanel.}BeSelectPanel{(inSelectWindow: BOOLEAN)}; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF inSelectWindow THEN ,currentWindow.selectWindow := SELF.window; (SELF.window.selectPanel := SELF; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TPanel.}CleanUpPanes{(deleteList: TList)}; (VAR s: TListScanner; ,pane: TPane; ,bs: TListScanner; ,band: TBand; ,vhs: VHSelect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF SELF.lastClick.gotPane THEN ,IF deleteList.Pos(0, SELF.lastClick.clickPane) > 0 THEN 0WITH SELF.lastClick DO 4BEGIN 4gotPane := FALSE; 4clickPt := clickPane.innerRect.topLeft; {+} 4END; (s := deleteList.Scanner; (WHILE s.Scan(pane) DO ,BEGIN ,SELF.panes.DelObject(pane, FALSE); ,FOR vhs := v To h DO 0BEGIN 0bs := SELF.bands[vhs].Scanner; 0WHILE bs.Scan(band) DO 4band.panes.DelObject(pane, FALSE); 0END; ,END; (deleteList.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sRes} $PROCEDURE {TPanel.}ComputeContentRect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (WITH SELF DO ,BEGIN ,{$H-} ,contentRect.topLeft := Point(FPtPlusPt(innerRect.topLeft, tlSideBandSize)); ,contentRect.botRight := Point(FPtMinusPt(innerRect.botRight, brSideBandSize)); ,InsetRect(contentRect, 1, 1); ,{$H+} ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $FUNCTION {TPanel.}CursorAt{(mousePt: Point): TCursorNumber}; (VAR pane: TPane; ,nearestPt: Point; $BEGIN ({$IFC fTrace}BP(2);{$ENDC} (IF NOT RectHasPt(SELF.outerRect, mousePt) THEN ,CursorAt := noCursor (ELSE (IF currentDocument = clipboard THEN ,CursorAt := arrowCursor (ELSE (IF RectHasPt(SELF.innerRect, mousePt) THEN ,BEGIN ,pane := TPane(SELF.ChildWithPt(mousePt, SELF.panes, nearestPt)); ,CursorAt := pane.CursorAt(mousePt); ,END (ELSE ,CursorAt := arrowCursor; ${$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCini} $PROCEDURE {TPanel.}DecideAboutBars{(newOuterRect: Rect)}; (VAR branch: TBranchArea; ,needsBothBars: BOOLEAN; ,vhs: VHSelect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (branch := SELF.FindBranchThatIsResized; (SELF.resizeBranch := branch; (needsBothBars := (branch <> NIL) OR ,(EqualPt(newOuterRect.botRight, SELF.window.outerRect.botRight) AND SELF.window.isResizable); (FOR vhs := v TO h DO ,SELF.scrollBars[vhs].ChangeVisibility(needsBothBars, zeroRect, SELF.abilities[vhs]); (SELF.SetOuterRect(newOuterRect); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCcld} $FUNCTION {TPanel.}Divide{(vhs: VHSelect; ?fromEdgeOfPanel: INTEGER; units: TUnitsFromEdge; ?whoCanResizeIt: TResizability; ?minSize: INTEGER; itsVAbilities, itsHAbilities: TAbilities): TPanel}; (VAR itsMinInnerDiag: Point; ,panel: TPanel; {the new panel} $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (itsMinInnerDiag := SELF.minInnerDiagonal; (itsMinInnerDiag.vh[vhs] := minSize; (panel := TPanel.CREATE(NIL, SELF.heap, SELF.window, ?itsMinInnerDiag.v, itsMinInnerDiag.h, itsVAbilities, itsHAbilities); (SELF.Insert(panel, vhs, fromEdgeOfPanel, units, whoCanResizeIt); (Divide := panel; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sScroll} $PROCEDURE {TPanel.}DoScrolling{(inArea: TArea; itsPane: TPane;  NIL THEN ,BEGIN ,outerRect := branch.outerRect; ,oldTopLeft := outerRect.topLeft; ,oldBotRight := outerRect.botRight; ,vhs := branch.arrangement; ,{don't resize in the orthogonal direction} ,minPt := oldBotRight; ,maxPt := oldBotRight; ,{limit resizing in the free direction} ,elderFirst := branch.elderFirst; ,branch.elderChild.GetMinExtent(minExtents[elderFirst], FALSE); ,branch.youngerChild.GetMinExtent(minExtents[NOT elderFirst], FALSE); ,minPt.vh[vhs] := oldTopLeft.vh[vhs] + minExtents[TRUE].vh[vhs]; ,maxPt.vh[vhs] := oldBotRight.vh[vhs] - minExtents[FALSE].vh[vhs]; ,{let the user specify the new botRight} ,ResizeFeedback(mousePt, minPt, maxPt, branch.TopLeftChild.outerRect, @0, dhSBox, dvSBox, newBotRight); ,newCd := newBotRight.vh[vhs]; ,IF newCd <> oldBotRight.vh[vhs] THEN 0branch.Redivide(newCd); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $FUNCTION {TPanel.}FindBranchThatIsResized{: TBranchArea}; (VAR child: TArea; ,fini: BOOLEAN; ,parent: TBranchArea; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} ({ Find the panel branch of which this is the bottom right corner of the top left child } (child := SELF; (fini := FALSE; (REPEAT ,parent := child.parentBranch; ,IF parent = NIL THEN 0fini := TRUE ,ELSE 0fini := parent.TopLeftChild = child; ,child := parent; *UNTIL fini; (FindBranchThatIsResized := NIL; (IF parent <> NIL THEN ,IF userCanResizeIt IN parent.resizability THEN 0FindBranchThatIsResized := parent; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TPanel.}Frame; (VAR actively: BOOLEAN; ,growRect: Rect; ,branch: TBranchArea; ,vhs: VHSelect; ,{$IFC LibraryVersion > 20} ,icon: Char; ,{$ENDC} $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (IF NOT RectsNest(SELF.innerRect, focusRgn^^.rgnBBox) THEN ,BEGIN ,TArea.Frame; ,actively := SELF.window.IsActive; ,IF SELF.scrollBars[v].isVisible OR SELF.scrollBars[h].isVisible THEN 0IF NOT EqualPt(SELF.outerRect.botRight, SELF.window.outerRect.botRight) THEN 4BEGIN {Draw the panel's resize box} 4SetRect(growRect, SELF.innerRect.right, SELF.innerRect.bottom, FSELF.outerRect.right, SELF.outerRect.bottom); 4FillRect(growRect, white); 4IF actively THEN 8BEGIN 8branch := SELF.resizeBranch; 8IF branch <> NIL THEN {Draw a resize icon in the box}  newThumbPos THEN 4BEGIN 4band.ThumbTo(newThumbPos); 4scroller.MoveThumb(band.ThumbPos); 4END; 0process.RememberCommand(uThumbing); 0END; ,iScrollBack, iScrollFwd, iFlipBack, iFlipFwd: 0BEGIN 0scroller.FillIcon(icon, TRUE); 0SELF.currentView.GetStdScroll(deltaLStd); 0SetupMvThumb(POINTER(scroller.sBoxID)); 0REPEAT 4band.ScrollStep(icon, deltaLStd.vh[vhs]); 4SELF.window.Update(TRUE); 4PenNormal; 4MoveThumb(band.ThumbPos); 0UNTIL NOT StillDown; 0scroller.FillIcon(icon, FALSE); 0process.RememberCommand(uScrolling); 0END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TPanel.}Insert{(panel: TPanel; vhs: VHSelect; ?fromEdgeOfPanel: INTEGER; units: TUnitsFromEdge; ?whoCanResizeIt: TResizability)}; (VAR window: TWindow; ,elderFirst: BOOLEAN; {TRUE if fromEdgeOfPanel<0 (new panel below or to right of old)} ,myOuterRect: Rect; {SELF.outerRect} ,mySize: INTEGER; {Length of SELF beforehand} ,itsOuterRect: Rect; {will be panel.outerRect} ,newSize: INTEGER; {Proposed length of the new panel (in the vh direction)} ,cdInWindow: INTEGER; {the coordinate of myOuterRect that is changing} ,myFormerParent: TBranchArea; ,ourNewParent: TBranchArea; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (window := SELF.window; (window.panels.InsLast(panel); (panel.window := window; (elderFirst := fromEdgeOfPanel < 0; (myOuterRect := SELF.outerRect; (mySize := LengthRect(myOuterRect, vhs); (itsOuterRect := myOuterRect; (newSize := ABS(fromEdgeOfPanel); (IF units = percentFromEdge THEN {convert to pixelsFromEdge} ,newSize := LIntDivInt(LIntMulInt(mySize, newSize), 100); (newSize := Max(1, Min(newSize, myOuterRect.botRight.vh[vhs] - myOuterRect.topLeft.vh[vhs] - 1)); (IF elderFirst THEN ,newSize := -newSize; (cdInWindow := TRectCoords(myOuterRect)[elderFirst].vh[vhs] + newSize; (TRectCoords(myOuterRect)[elderFirst].vh[vhs] := cdInWindow; (TRectCoords(itsOuterRect)[NOT elderFirst].vh[vhs] := cdInWindow; (myFormerParent := SELF.parentBranch; (ourNewParent := TBranchArea.CREATE(NIL, SELF.Heap, vhs, elderFirst, whoCanResizeIt, SELF, panel); (IF myFormerParent = NIL THEN ,window.panelTree := ourNewParent (ELSE ,myFormerParent.ReplaceChild(SELF, ourNewParent); (panel.SetOuterRect(zeroRect); {since the panel is not on the screen right now, Lit shouldn't have any size} (panel.ResizeOutside(itsOuterRect); (SELF.ResizeOutside(myOuterRect); ({Just in case some panel is below its mimimum size, let the window expand if needed} (window.Resize(FALSE); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgDRWres} $PROCEDURE {TPanel.}Invalidate; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (PushFocus; (SELF.window.Focus; (InvalRect(SELF.innerRect); (PopFocus; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} $PROCEDURE {TPanel.}InvalLRect{(lRectInView: LRect)}; (PROCEDURE InvalOnThePad; (BEGIN ,thePad.InvalLRect(lRectInView); (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.OnAllPadsDo(InvalOnThePad); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TPanel.}MakeBand{(vhs: VHSelect; scroller, prevScroller: TScroller)}; (VAR prevBand: TBand; ,band: TBand; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (prevBand := prevScroller.band; (band := SELF.NewBand(SELF.Heap, zeroRect, scroller, vhs); (band.panes.Become(prevBand.panes.Clone(SELF.Heap)); (SELF.bands[vhs].InsAt(SELF.bands[vhs].Pos(0, prevBand) + 1, band); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sSplit} $PROCEDURE {TPanel.}MoveSplitBefore{(scroller: TScroller; newSkwrCd: INTEGER)}; (VAR vhs: VHSelect; ,outsideContent: BOOLEAN; ,hsb: THsb; ,prevHsb: THsb; ,prevScroller: TScroller; ,nextScroller: TScroller; ,otherBand: TBand; ,band: TBand; ,oldSkwrCd: INTEGER; ,newViewLCd: LONGINT; ,viewDeltaLCd: LONGINT; {-gb} ,sbRect: Rect; ,newSkwrPt: Point; ,sbList: TSbList; ,limitRect: Rect; ,r: Rect; (PROCEDURE InvalScrollers(firstBand, lastBand: TBand); ,VAR firstSbRect: Rect; 0lastSbRect: Rect; (BEGIN ,firstBand.scroller.GetSize(firstSbRect); ,lastBand.scroller.GetSize(lastSbRect); ,UnionRect(firstSbRect, lastSbRect, firstSbRect); ,InvalRect(firstSbRect); (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (vhs := scroller.ScrollDir; (outsideContent := TRUE; (WITH SELF.contentRect DO ,IF newSkwrCd <= topLeft.vh[vhs] THEN 0newSkwrCd := topLeft.vh[vhs] - 1 ,ELSE IF newSkwrCd >= botRight.vh[vhs] THEN 0newSkwrCd := botRight.vh[vhs] + 1 ,ELSE 0outsideContent := FALSE; (hsb := Pointer(scroller.sBoxID); (prevHsb := HsbPrev(hsb); (IF prevHsb = hsbNil THEN ,BEGIN ,prevScroller := NIL; ,{make scroller refer to the scroller we are going to split} ,scroller.GetSize(sbRect); ,newSkwrPt.vh[vhs] := newSkwrCd; ,newSkwrPt.vh[orthogonal[vhs]] := sbRect.topLeft.vh[orthogonal[vhs]]; ,PreSbList(sbList, scroller.scrollBar); ,hsb := HsbFromPt(sbList, newSkwrPt); ,PostSbList(sbList, scroller.scrollBar); ,IF (hsb = hsbNil) {user started to create a new split but changed his mind} OR /outsideContent {new split would be in a side band} THEN 0scroller := NIL {user started to create a new split but changed his mind} ,ELSE 0scroller := TScroller(RefconSb(hsb)); ,END (ELSE ,BEGIN ,prevScroller := TScroller(RefconSb(prevHsb)); ,{don't allow the new position of split to cross another split} ,FixRLimits(hsb, limitRect); ,WITH limitRect DO 0newSkwrCd := Max(topLeft.vh[vhs], Min(botRight.vh[vhs], newSkwrCd)); ,END; (IF scroller <> NIL THEN ,BEGIN ,scroller.GetSize(sbRect); ,oldSkwrCd := sbRect.topLeft.vh[vhs]; ,WITH SELF.contentRect DO 0IF oldSkwrCd <= topLeft.vh[vhs] THEN 4oldSkwrCd := topLeft.vh[vhs] - 1 0ELSE IF oldSkwrCd >= botRight.vh[vhs] THEN 4oldSkwrCd := botRight.vh[vhs] + 1; ,IF newSkwrCd <> oldSkwrCd THEN 0BEGIN 0band := scroller.band; 0viewDeltaLCd := newSkwrCd - oldSkwrCd; {-gb} 0IF SELF.zoomed THEN { if zoomed then adjust viewDeltaLCd accordingly } {-gb} 4WITH SELF.zoomFactor DO {-gb} +{$H-} viewDeltaCd := LIntOvrInt(LIntMulInt(viewDeltaLCd, denominator.vh[vhs]), R{-gb +++LSR+++} numerator.vh[vhs]); +{$H-} 0newViewLCd := band.ViewLCd + viewDeltaLCd; 0IF prevScroller = NIL THEN 4BEGIN {new band} 4IF hsb <> hsbNil THEN 8BEGIN 8InvalScrollers(band, band); 8scroller.SplitAt(newSkwrCd, nextScroller); 8SELF.ResizeBand(vhs, band, band.ViewLCd, FALSE); 8SELF.MakeBand(vhs, nextScroller, scroller); 8otherBand := nextScroller.band; 8SELF.ResizeBand(vhs, otherBand, newViewLCd, FALSE); 8{must invalidate now (special case)} 8IF otherBand.ViewLCd <> newViewLCd THEN {the new band scrolled a bit}  mPrvwMargins) THEN ,BEGIN ,pane.Focus; ,DoOnThePad; ,END (ELSE ,BEGIN ,IF SELF.previewMode = mPrvwMargins THEN 0SELF.panes.Each(YouDoOnPages) ,ELSE 0SELF.panes.Each(YouDo); ,END; (PopFocus; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCres} ${$S sRes} $FUNCTION {TPanel.}PaneShowing{(anLRect: LRect): TPane}; (VAR pane: TPane; ,s: TListScanner; ,viewedLRect: LRect; ,scrollableLRect: LRect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (PaneShowing := NIL; (s := SELF.panes.Scanner; (WHILE s.Scan(pane) DO ,BEGIN ,pane.GetScrollLimits(viewedLRect, scrollableLRect); ,WITH anLRect DO 0BEGIN 0LRectHaveLPt(scrollableLRect, topLeft); 0LRectHaveLPt(scrollableLRect, botRight); 0END; ,WITH viewedLRect DO 0IF top <= anLRect.bottom THEN 4IF bottom >= anLRect.top THEN 8IF left <= anLRect.right THEN = anLRect.left THEN @BEGIN @s.Done; @PaneShowing := pane; @END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $FUNCTION {TPanel.}PaneToScroll(VAR anLRect: LRect; hMinToSee, vMinToSee: INTEGER): TPane; (VAR tempLRect: LRect; ,pane: TPane; ,dummyPt: Point; $BEGIN ({$IFC fTrace}BP(5);{$ENDC} (WITH anLRect DO ,BEGIN ,tempLRect.top := top + vMinToSee; ,tempLRect.bottom := bottom - vMinToSee; ,tempLRect.left := left + hMinToSee; ,tempLRect.right := right - hMinToSee; ,END; (pane := SELF.PaneShowing(tempLRect); (IF pane = NIL THEN ,BEGIN ,pane := SELF.PaneShowing(anLRect); ,IF pane = NIL THEN 0WITH SELF.lastClick DO 4BEGIN 4IF NOT gotPane THEN 8BEGIN 8{$H-} 8clickPane := TPane(SELF.ChildWithPt(clickPt, SELF.panes, dummyPt)); 8{$H+} 8gotPane := TRUE; 8END; 4pane := clickPane; 4END; ,END (ELSE ,pane := NIL; {already showing The Right Stuff} (PaneToScroll := pane; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sCldInit} $PROCEDURE {TPanel.}Preview{(newMode: TPreviewMode)}; (VAR oldMode: TPreviewMode; ,showMargins: BOOLEAN; ,hideMargins: BOOLEAN; ,noSelection: TSelection; ,paginatedView: TPaginatedView; ,vhs: VHSelect; ,offset: LPoint; ,bs: TListScanner; ,band: TBand; ,firstPane: TPane; ,pagiLPoint: LPoint; ,ps: TListScanner; ,pane: TPane; ,pageEditView: TView; ,unPagLPt: LPoint; {and pageLocation out!} (PROCEDURE XorBreaksOnThePad; (BEGIN ,SELF.view.printManager.DrawBreaks(FALSE); (END; (PROCEDURE ClearSelection; (BEGIN ,noSelection := SELF.selection.FreedAndReplacedBy(SELF.view.NoSelection); (END; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (IF SELF.view.isPrintable THEN {Actually shouldn't be called unless isPrintable} ,BEGIN ,oldMode := SELF.previewMode; ,showMargins := (newMode = mPrvwMargins); ,hideMargins := (oldMode = mPrvwMargins); ,IF oldMode = newMode THEN 0BEGIN 0END ,ELSE ,IF showMargins OR hideMargins THEN 0BEGIN 0paginatedView := SELF.paginatedView; 0IF showMargins THEN 4BEGIN 4paginatedView := SELF.view.printManager.NewPaginatedView(NIL); 4SELF.currentView := paginatedView; 4SELF.paginatedView := paginatedView; 4END 0ELSE 4SELF.currentView := SELF.view; { newMode = show Breaks or show main view } 0SELF.previewMode := newMode; 0FOR vhs := v TO h DO 4BEGIN 4offset.vh[orthogonal[vhs]] := 0; 4bs := SELF.bands[vhs].Scanner; 4WHILE bs.Scan(band) DO 8BEGIN 8firstPane := TPane(band.panes.First); 8IF showMargins THEN  NIL THEN ,SELF.view.printManager.Print(printPref); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} {$S sStartup} $PROCEDURE {TPanel.}Refresh{(rActions: TActions; highTransit: THighTransit)}; (PROCEDURE RefreshPane(obj: TObject); ,VAR pane: TPane; (BEGIN ,pane := TPane(obj); ,IF RectIsVisible(pane.outerRect) THEN 0pane.Refresh(rActions, highTransit); (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} ({$IFC fDbgABC} (IF (rBackground IN rActions) AND (highTransit > hOffToOn) THEN ,ABCBreak('Refresh: rBackground requested, but highTransit does not start from Off', 0); ({$ENDC} (IF rFrame IN rActions THEN ,SELF.Frame; (SELF.panes.Each(RefreshPane); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCres} ${$S SgABCcld} $PROCEDURE {TPanel.}RemakePanes; (VAR vs, ps: TListScanner; ,band: TBand; ,pane: TPane; $BEGIN ${assumes they are right in the bands} ({$IFC fTrace}BP(7);{$ENDC} (SELF.panes.DelAll(FALSE); (vs := SELF.bands[v].Scanner; (WHILE vs.Scan(band) DO ,BEGIN ,ps := band.panes.Scanner; ,WHILE ps.Scan(pane) DO 0SELF.panes.insLast(pane); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCcld} $PROCEDURE {TPanel.}RememberSplit{(vhs: VHSelect; atCd: INTEGER)}; (VAR deletedSplits: TArray; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (deletedSplits := SELF.deletedSplits; (IF deletedSplits <> NIL THEN ,BEGIN ,{$IFC fDbgABC} ,IF deletedSplits.recordBytes <> 2 THEN 0ABCbreak('This panel has a deletedSplits array, but its recordBytes <> 2', ORD(SELF)); ,{$ENDC} ,IF vhs = v THEN 0atCd := - atCd; ,deletedSplits.InsLast(@atCd); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCcld} $PROCEDURE {TPanel.}Remove; (VAR itsParent: TBranchArea; ,itsGrandParent: TBranchArea; ,itsSibling: TArea; ,itsWindow: TWindow; ,firstPanel: TPanel; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (itsParent := SELF.parentBranch; (itsWindow := SELF.window; ({$IFC fDbgABC} (IF itsParent = NIL THEN ,ABCBreak('You cannot remove the last panel in the window', ORD(SELF)); ({$ENDC} (itsGrandParent := itsParent.parentBranch; (itsSibling := itsParent.OtherChild(SELF); (itsSibling.ResizeOutside(itsParent.outerRect); (itsSibling.parentBranch := itsGrandParent; (IF itsGrandParent = NIL THEN ,itsWindow.panelTree := itsSibling (ELSE ,itsGrandParent.ReplaceChild(itsParent, itsSibling); {also sets my parentBranch to NIL} (SELF.resizeBranch := NIL; (firstPanel := TPanel(itsWindow.panels.First); (IF itsWindow.selectPanel = SELF THEN ,itsWindow.selectPanel := firstPanel; (IF itsWindow.clickPanel = SELF THEN ,itsWindow.clickPanel := firstPanel; ({We do not change undoSelPanel & undoClickPanel because undo may bring them back; so caller beware!} (itsParent.Free; (itsWindow.panels.DelObject(SELF, FALSE); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCcld} $PROCEDURE {TPanel.}RepaneOrthogonalBands{(vhs: VHSelect)}; (VAR bs, orthoBs, ps: TListScanner; ,orthoBands: TList; ,band, oBand: TBand; ,pane: TPane; $BEGIN ${assumes they are right in the orthogonal band} ({$IFC fTrace}BP(7);{$ENDC} (orthoBands := SELF.bands[orthogonal[vhs]]; (orthoBs := orthoBands.Scanner; (while orthoBs.Scan(oBand) do ,oBand.panes.DelAll(FALSE); (bs := SELF.bands[vhs].Scanner; (WHILE bs.Scan(band) DO ,BEGIN ,ps := band.panes.Scanner; ,orthoBs := orthoBands.Scanner; ,WHILE ps.Scan(pane) AND orthoBs.Scan(oBand) DO 0oBand.panes.insLast(pane); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCcld} $PROCEDURE {TPanel.}Replace{(panel: TPanel)}; (VAR itsParent: TBranchArea; ,itsWindow: TWindow; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (itsParent := SELF.parentBranch; (itsWindow := SELF.window; (itsWindow.panels.DelObject(SELF, FALSE); (itsWindow.panels.InsLast(panel); (IF itsParent = NIL THEN ,itsWindow.panelTree := panel (ELSE ,itsParent.ReplaceChild(SELF, panel); {also sets my parentBranch to NIL} (SELF.resizeBranch := NIL; (panel.ResizeOutside(SELF.outerRect); (IF itsWindow.selectPanel = SELF THEN ,itsWindow.selectPanel := panel; (IF itsWindow.clickPanel = SELF THEN ,itsWindow.clickPanel := panel; ({We do not change undoSelPanel & undoClickPanel because undo may bring them back; so caller beware!} ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sCldInit} $PROCEDURE {TPanel.}Rescroll; (VAR vhs: VHSelect; ,band: TBand; ,s: TListScanner; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (InvalRect(SELF.outerRect); {Since the view is changing, no part of the old image is good} (FOR vhs := v TO h DO ,BEGIN ,s := SELF.bands[vhs].Scanner; ,WHILE s.Scan(band) DO 0IF band.scroller <> NIL THEN 4SetThumb(POINTER(band.scroller.sBoxID), band.ThumbPos); 8{since we invalidated everything, just telling the SB library where the  firstBand) AND (nextTopLeft >= lastBotRight) THEN 8BEGIN 8ps := band.panes.Scanner; 8WHILE ps.Scan(pane) DO  band.ViewLCd THEN  NIL THEN ,BEGIN ,{$IFC fDbgABC} ,IF deletedSplits.recordBytes <> 2 THEN 0ABCbreak('This panel has a deletedSplits array, but its recordBytes <> 2', ORD(SELF)); ,{$ENDC} ,contentRect := SELF.contentRect; ,FOR vhs := v TO h DO 0firstScrollers[vhs] := SELF.scrollBars[vhs].firstBox; ,s := deletedSplits.Scanner; ,WHILE s.Scan(pInt) DO 0BEGIN 0cd := TpInteger(pInt)^; 0IF cd < 0 THEN 4BEGIN 4vhs := v; 4cd := - cd; 4END 0ELSE 4vhs := h; 0IF (cd > contentRect.topLeft.vh[vhs]) AND 3(cd < contentRect.botRight.vh[vhs] - dptSkewer.vh[vhs]) THEN 4BEGIN 4SELF.MoveSplitBefore(firstScrollers[vhs], cd); 4s.Delete; 4END; 0END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sRes} $PROCEDURE {TPanel.}RevealLRect(VAR anLRect: LRect; hMinToSee, vMinToSee: INTEGER); (VAR pane: TPane; ,revisedLRect: LRect; $BEGIN ({$IFC fTrace}BP(5);{$ENDC} (IF SELF.previewMode = mPrvwMargins THEN {need to map coords} ,BEGIN ,SELF.paginatedView.PagifyLPt(anLRect.topLeft, revisedLRect.topLeft); ,SELF.paginatedView.PagifyLPt(anLRect.botRight, revisedLRect.botRight); ,END (ELSE ,revisedLRect := anLRect; (pane := SELF.PaneToScroll(revisedLRect, hMinToSee, vMinToSee); (IF pane <> NIL THEN ,pane.ScrollToReveal(revisedLRect, hMinToSee, vMinToSee); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TPanel.}SetInnerRect{(newInnerRect: Rect)}; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SUPERSELF.SetInnerRect(newInnerRect); (SELF.ComputeContentRect; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TPanel.}SetOuterRect{(newOuterRect: Rect)}; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SUPERSELF.SetOuterRect(newOuterRect); (SELF.ComputeContentRect; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TPanel.}SetZoomFactor{(zoomNumerator, zoomDenominator: Point)}; (VAR s: TListScanner; ,pane: TPane; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (Reduce(zoomNumerator.h, zoomDenominator.h); {reduce to lowest terms} (Reduce(zoomNumerator.v, zoomDenominator.v); {reduce to lowest terms} ({$IFC fDbgABC} (IF fExperimenting THEN ,WriteLn('New (h) Zoom: ', zoomNumerator.h:1, '/', zoomDenominator.h:1); ({$ENDC} (WITH SELF, zoomFactor DO ,BEGIN ,numerator := zoomNumerator; ,denominator := zoomDenominator; ,zoomed := (numerator.h <> denominator.h) OR (numerator.v <> denominator.v); ,END; (s := SELF.panes.Scanner; (WHILE s.Scan(pane) DO ,pane.SetZoomFactor(zoomNumerator, zoomDenominator); (SELF.Rescroll; {Does Invalidate and Moves Thumbs} ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} {$S SgABCcld} $PROCEDURE {TPanel.}ShowSideBand{(vhs: VHSelect; topOrLeft: BOOLEAN; size: INTEGER; viewLCd: LONGINT)}; (VAR x: INTEGER; ,bandIndex: INTEGER; ,band: TBand; ,contentRect: Rect; ,tempRect: Rect; ,oldSideSize: INTEGER; ,newViewLCd: LONGINT; ,scroller: TScroller; ,s: TListScanner; ,bandVHS: VHSelect; ,bandIsCovered: BOOLEAN; ,moveNextSplit: BOOLEAN; ,removeCd: INTEGER; ,coBand: TBand; $BEGIN ({$IFC fTrace}BP(12);{$ENDC} (SELF.SideBandRect(vhs, topOrLeft, tempRect); (oldSideSize := LengthRect(tempRect, vhs); (x := Max(-1, size); (WITH SELF DO ,IF topOrLeft THEN 0tlSideBandSize.vh[vhs] := x ,ELSE 0brSideBandSize.vh[vhs] := x; (SELF.ComputeContentRect; (IF size > oldSideSize THEN ,BEGIN ,SELF.window.Resize(FALSE); {make sure we have enough space for the bigger side band} ,{ delete splits that are now covered by the bigger side band } ,IF topOrLeft THEN 0removeCd := 0 ,ELSE 0removeCd := MAXINT; ,moveNextSplit := FALSE; ,s := SELF.bands[vhs].Scanner; ,WHILE s.Scan(band) DO 0IF band.scroller <> NIL THEN {not a side band} 4BEGIN 4bandIsCovered := NOT SectRect(band.innerRect, SELF.contentRect, tempRect); 4IF bandIsCovered THEN 8s.Delete(FALSE); {delete it from the list before some other method, so our scanner Ldoesn't get confused; it will still get freed later, though} 4IF moveNextSplit OR (bandIsConvered AND NOT topOrLeft) THEN 8BEGIN 8SELF.RememberSplit(vhs, band.outerRect.topLeft.vh[vhs]); 8SELF.MoveSplitBefore(band.scroller, removeCd); 8END; 4moveNextSplit := bandIsCovered AND topOrLeft; 4END; ,END; (SELF.SideBandRect(vhs, topOrLeft, tempRect); ({Create/Resize/Delete the sideBand} (IF (oldSideSize = -1) AND (size >= 0) THEN {create} ,BEGIN ,band := TSideBand.CREATE(NIL, SELF.Heap, SELF, tempRect, vhs, topOrLeft, viewLCd); ,coBand := TSideBand(band).Coband; ,InvalRect(tempRect); ,SELF.RepaneOrthogonalBands(vhs); ,SELF.RemakePanes; ,{calculate the new viewLCd for the side band's coBand} ,newViewLCd := coBand.ViewLCd; ,IF topOrLeft THEN 0newViewLCd := newViewLCd + size + 1; ,END (ELSE IF oldSideSize >= 0 THEN ,BEGIN ,IF topOrLeft THEN {get the side band to resize into band} 0band := TBand(SELF.bands[vhs].First) ,ELSE 0band := TBand(SELF.bands[vhs].Last); ,coband := TSideBand(band).Coband; ,band.SetInnerRect(tempRect); {side bands are resized according to their current inner/outerRects} ,SELF.ResizeBand(vhs, band, band.ViewLCd, TRUE); ,{calculate the new viewLCd for the side band's coBand} ,newViewLCd := coBand.ViewLCd; ,IF topOrLeft THEN 0newViewLCd := newViewLCd + size - oldSideSize; ,END (ELSE ,coBand := NIL; (IF coBand <> NIL THEN ,BEGIN ,{resize the regular band that is next to the sideBand (coband)} ,SELF.ResizeBand(vhs, coBand, newViewLCd, TRUE); ,{invalidate the scroller associated with coBand} ,coBand.scroller.GetSize(tempRect); ,InvalRect(tempRect); ,SELF.RestoreSplits; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCres} ${$S SgABCcld} $PROCEDURE {TPanel.}SideBandRect{(vhs: VHSelect; topOrLeft: BOOLEAN; VAR bandRect: Rect)}; ({gets the innerRect of a side band, given the current contentRect} (VAR contentRect: Rect; $BEGIN (bandRect := SELF.innerRect; (WITH bandRect DO ,IF topOrLeft THEN 0botRight.vh[vhs] := topLeft.vh[vhs] + SELF.tlSideBandSize.vh[vhs] ,ELSE 0topLeft.vh[vhs] := botRight.vh[vhs] - SELF.brSideBandSize.vh[vhs]; $END; {$S SgABCini} END; {$S SgABCres} METHODS OF TBand; ${$S sCldInit} $FUNCTION {TBand.}CREATE{(object: TObject; heap: THeap; itsPanel: TPanel; itsInnerRect: Rect; ;itsScroller: TScroller; itsDir: VHSelect): TBand}; (VAR panes: TList; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TBand(object); (WITH SELF DO ,BEGIN ,window := itsPanel.window; ,panel := itsPanel; ,scroller := itsScroller; ,scrollDir := itsDir; ,parentBranch := NIL; ,END; (panes := TList.CREATE(NIL, heap, 1); (SELF.panes := panes; (SELF.SetInnerRect(itsInnerRect); (IF itsScroller <> NIL THEN ,itsScroller.band := SELF; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCini} $PROCEDURE {TBand.}Free; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (Free(SELF.scroller); (SELF.panes.FreeObject; (TArea.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TBand.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN (TArea.Fields(Field); (Field('window: TWindow'); (Field('panes: TList'); (Field('panel: TPanel'); (Field('scroller: TScroller'); (Field('scrollDir: Byte'); (Field(''); $END; ${$S SgABCres} ${$ENDC} ${$S sScroll} $PROCEDURE {TBand.}OffsetPanes{(deltaLPt: LPoint)}; (PROCEDURE YouOffset(obj: TObject); (BEGIN ,TPane(obj).OffsetBy(deltaLPt); (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.panes.Each(YouOffset); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sCldInit} $PROCEDURE {TBand.}ResizeOutside{(newOuterRect: Rect)}; (VAR scroller: TScroller; ,newScrollerSize: Rect; ,unchangedRect: Rect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF NOT EqualRect(SELF.outerRect, newOuterRect) THEN ,BEGIN ,unchangedRect := SELF.outerRect; ,IF NOT EqualPt(unchangedRect.topLeft, newOuterRect.topLeft) THEN 0unchangedRect := zeroRect ,ELSE 0InsetRect(unchangedRect, 1, 1); {we want unchangedRect to be the old innerRect} ,InvalDiffRect(newOuterRect, unchangedRect); ,scroller := SELF.scroller; ,SELF.SetOuterRect(newOuterRect); ,newScrollerSize := SELF.outerRect; ,WITH SELF DO 0BEGIN 0newScrollerSize.botRight.vh[orthogonal[scrollDir]] := 4panel.innerRect.botRight.vh[orthogonal[scrollDir]] + 1; 0IF innerRect.topLeft.vh[scrollDir] = panel.contentRect.topLeft.vh[scrollDir] THEN 4newScrollerSize.topLeft.vh[scrollDir] := panel.innerRect.topLeft.vh[scrollDir] - 1; 0IF innerRect.botRight.vh[scrollDir] = panel.contentRect.botRight.vh[scrollDir] THEN 4newScrollerSize.botRight.vh[scrollDir] := panel.innerRect.botRight.vh[scrollDir] + 1; 0END; ,scroller.SetSize(newScrollerSize); ,SELF.ResizePanes(SELF.ViewLCd); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sCldInit} $PROCEDURE {TBand.}ResizePanes{(newViewLCd: LONGINT)}; ${assumes SELF.innerRect already set} (VAR vhs: VHSelect; ,s: TListScanner; ,pane: TPane; ,viewedLRect: LRect; ,scrollableLRect: LRect; ,oldViewLCd: LONGINT; ,deltaLPt: LPoint; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (vhs := SELF.scrollDir; (s := SELF.panes.Scanner; (WHILE s.Scan(pane) DO ,pane.Resize(SELF.innerRect, vhs); (IF SELF.panel.currentView <> NIL THEN ,BEGIN ,pane := TPane(SELF.panes.First); ,pane.GetScrollLimits(viewedLRect, scrollableLRect); ,oldViewLCd := SELF.ViewLCd; ,newViewLCd := Max(scrollableLRect.topLeft.vh[vhs], =Min(scrollableLRect.botRight.vh[vhs] - LengthLRect(viewedLRect, vhs), AnewViewLCd)); ,deltaLPt.vh[orthogonal[vhs]] := 0; &{$H-} deltaLPt.vh[vhs] := newViewLCd - oldViewLCd; {$H+} ,SELF.OffsetPanes(deltaLPt); ,SELF.ScrollBy(0); ,SetThumb(POINTER(SELF.scroller.sBoxID), SELF.ThumbPos); 0{need to set thumb because band changed size} ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sScroll} $PROCEDURE {TBand.}ScrollBy{(deltaLCd: LONGINT)}; ({positive scrolls towards end; 0 means resize & don't move thumb} (VAR deltaLPt: LPoint; ,vhs: VHSelect; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (PushFocus; (SELF.window.Focus; (WITH SELF, deltaLPt DO +BEGIN +vhs := scrollDir; +vh[vhs] := deltaLCd; +vh[orthogonal[vhs]] := 0; +END; (SELF.panel.DoScrolling(SELF, TPane(SELF.panes.First), vhs=h, vhs=v, deltaLPt); (IF NOT EqualLPt(deltaLPt, zeroLPt) THEN ,SELF.OffsetPanes(deltaLPt); (IF deltaLCd <> 0 THEN ,IF SELF.scroller <> NIL THEN {can this be a side band???} 0SELF.scroller.MoveThumb(SELF.ThumbPos); (PopFocus; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $PROCEDURE {TBand.}ScrollStep{(icon: TEnumIcons; deltaLStd: LONGINT)}; (VAR vhs: VHSelect; ,len: LONGINT; ,deltaLCd: LONGINT; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (vhs := SELF.scrollDir; (len := LIntDivInt(LengthRect(SELF.innerRect, vhs) * ORD4(SELF.panel.view.res.vh[vhs]), 8screenRes.vh[vhs]); (CASE icon OF {how far to scroll without regard for overshooting the ends} ,iScrollBack: 0deltaLCd := -deltaLStd; ,iScrollFwd: 0deltaLCd := deltaLStd; ,iFlipBack: 0deltaLCd := Min(deltaLStd - len, -deltaLStd); ,iFlipFwd: 0deltaLCd := Max(len - deltaLStd, deltaLStd); ,END; (SELF.ScrollBy(deltaLCd); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $PROCEDURE {TBand.}ScrollTo{(viewLCd: LONGINT)}; (VAR pane: TPane; ,deltaLCd: LONGINT; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (pane := TPane(SELF.panes.First); (deltaLCd := viewLCd - pane.viewedLRect.topLeft.vh[SELF.scrollDir]; (SELF.ScrollBy(deltaLCd); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $FUNCTION {TBand.}ThumbPos{: INTEGER}; (VAR vhs: VHSelect; ,pane: TPane; ,viewedLRect: LRect; ,scrollableLRect: LRect; ,thumbLRange: LONGINT; ,barRange: INTEGER; ,lOffset: LONGINT; ,barPos: INTEGER; $BEGIN ({$IFC fTrace}BP(4);{$ENDC} (vhs := SELF.scrollDir; (pane := TPane(SELF.panes.First); (pane.GetScrollLimits(viewedLRect, scrollableLRect); (thumbLRange := LengthLRect(scrollableLRect, vhs) - LengthLRect(viewedLRect, vhs); (barRange := SELF.scroller.ThumbRange; (IF barRange = 0 THEN ,ThumbPos := 0 (ELSE ,BEGIN ,lOffset := viewedLRect.topLeft.vh[vhs] - scrollableLRect.topLeft.vh[vhs]; ,IF thumbLRange > 1 THEN {Only divide by positive denominators} 0barPos := LIntDivLInt(LIntMulInt(lOffset, barRange - 1) + thumbLRange - barRange, QthumbLRange - 1) ,ELSE ,IF (thumbLRange = 1) AND (lOffset > 0) THEN {Very rare case: view one pixel bigger ]than pane...} 0barPos := barRange {...and scrolled to end} ,ELSE 0barPos := 0; {Usually because the view is smaller than the ]pane} ,{barPos = 0 or barRange only if nowhere to scroll} ,ThumbPos := Max(0, Min(1000, LIntDivInt(LIntMulInt(barPos, 1000) + barRange - 1, barRange))); .{ThumbPos = 0 or 1000 only if nowhere to scroll [assumes band is <= 1000 pixels long]} ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $PROCEDURE {TBand.}ThumbTo{(newThumbPos: INTEGER)}; (VAR vhs: VHSelect; ,thumbLRange: LONGINT; ,pane: TPane; ,viewedLRect: LRect; ,scrollableLRect: LRect; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (vhs := SELF.scrollDir; (pane := TPane(SELF.panes.First); (pane.GetScrollLimits(viewedLRect, scrollableLRect); (thumbLRange := LengthLRect(scrollableLRect, vhs) - LengthLRect(viewedLRect, vhs); (SELF.ScrollTo(scrollableLRect.topLeft.vh[vhs] + 8LIntDivInt(LIntMulInt(thumbLRange, newThumbPos), 1000)); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $FUNCTION {TBand.}ViewLCd{: LONGINT}; (VAR pane: TPane; $BEGIN ({$IFC fTrace}BP(4);{$ENDC} (pane := TPane(SELF.panes.First); (ViewLCd := pane.viewedLRect.topLeft.vh[SELF.scrollDir]; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCini} END; {$S SgABCres} METHODS OF TSideBand; ${$S SgABCcld} $FUNCTION {TSideBand.}CREATE{(object: TObject; heap: THeap; itsPanel: TPanel; itsInnerRect: Rect; ;itsDir: VHSelect; itsTopOrLeft: BOOLEAN; ;itsViewLCd: LONGINT): TSideBand}; $VAR bandList: TList; (itsCoBand: TBand; (deltaLPt: LPoint; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (TSideBand(object).topOrLeft := itsTopOrLeft; {needed to be set before SetInnerRect, which is Ldone in TBand.CREATE} (SELF := TSideBand(TBand.CREATE(object, heap, itsPanel, itsInnerRect, NIL, itsDir)); (bandList := itsPanel.bands[itsDir]; (IF itsTopOrLeft THEN ,BEGIN ,itsCoBand := TBand(bandList.First); ,bandList.InsFirst(SELF); ,END (ELSE ,BEGIN ,itsCoBand := TBand(bandList.Last); ,bandList.InsLast(SELF); ,END; (SELF.panes.Become(itsCoBand.panes.Clone(heap)); (SELF.ResizePanes(itsViewLCd); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TSideBand.}Free; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (SELF.scroller := NIL; {let my coBand free the scroller} (SUPERSELF.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TSideBand.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (SUPERSELF.Fields(Field); (Field('topOrLeft: BOOLEAN'); (Field(''); ({$IFC fTrace}EP;{$ENDC} $END; ${$ENDC} ${$S SgABCcld} $FUNCTION {TSideBand.}CoBand{: TBand}; (VAR bandList: TList; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (bandList := SELF.panel.bands[SELF.scrollDir]; (IF SELF.topOrLeft THEN ,CoBand := TBand(bandList.At(2)) (ELSE ,CoBand := TBand(bandList.At(bandList.Size-1)); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TSideBand.}GetBorder{(VAR border: Rect)}; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SUPERSELF.GetBorder(border); (WITH SELF, border DO ,IF topOrLeft THEN 0botRight.vh[scrollDir] := 0 ,ELSE 0topLeft.vh[scrollDir] := 0; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TSideBand.}ResizeOutside{(newOuterRect: Rect)}; (VAR unchangedRect: Rect; ,rectToInval: Rect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF NOT EqualRect(SELF.outerRect, newOuterRect) THEN ,BEGIN ,unchangedRect := SELF.outerRect; ,IF NOT EqualPt(unchangedRect.topLeft, newOuterRect.topLeft) THEN 0unchangedRect := zeroRect ,ELSE 0InsetRect(unchangedRect, 1, 1); {we want unchangedRect to be the old innerRect} ,SELF.SetOuterRect(newOuterRect); ,rectToInval := SELF.innerRect; ,InsetRect(rectToInval, -1, -1); ,InvalDiffRect(rectToInval, unchangedRect); ,SELF.ResizePanes(SELF.ViewLCd); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TSideBand.}ResizePanes{(newViewLCd: LONGINT)}; ${assumes SELF.innerRect already set} (VAR vhs: VHSelect; ,s: TListScanner; ,pane: TPane; ,viewedLRect: LRect; ,scrollableLRect: LRect; ,oldViewLCd: LONGINT; ,deltaLPt: LPoint; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (vhs := SELF.scrollDir; (s := SELF.panes.Scanner; (WHILE s.Scan(pane) DO ,pane.Resize(SELF.innerRect, vhs); (oldViewLCd := SELF.ViewLCd; (deltaLPt.vh[orthogonal[vhs]] := 0; (deltaLPt.vh[vhs] := newViewLCd - oldViewLCd; (SELF.OffsetPanes(deltaLPt); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sError} $PROCEDURE {TSideBand.}ScrollTo{(viewLCd: LONGINT)}; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (ABCBreak('Can not do TSideBand.ScrollTo', 0); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $FUNCTION {TSideBand.}ThumbPos{: INTEGER}; $BEGIN ({$IFC fTrace}BP(4);{$ENDC} (ThumbPos := 0; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCini} END; {$S SgABCres} METHODS OF TPane; ${$S sCldInit} $FUNCTION {TPane.}CREATE{(object: TObject; heap: THeap; itsPanel: TPanel; itsInnerRect: Rect; =itsViewedLRect: LRect): TPane}; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TPane(TPad.CREATE(object, heap, itsInnerRect, itsViewedLRect, screenRes, BscreenRes, POINTER(itsPanel.window.wmgrId))); (SELF.currentView := itsPanel.currentView; {presumably unnecessary because will be done by haveView} (SELF.panel := itsPanel; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TPane.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN (TPad.Fields(Field); (Field('currentView: TView'); (Field('panel: TPanel'); $END; ${$S SgABCres} ${$ENDC} ${$S sRes} $FUNCTION {TPane.}CursorAt{(mousePt: Point): TCursorNumber}; ({assumes mousePt is within the pane's innerRect} (VAR mouseLPt: LPoint; ,panePt: Point; {window-relative, under the coordinate system defined by pane} $BEGIN ({$IFC fTrace}BP(2);{$ENDC} (PushFocus; (panePt := mousePt; (LocalToGlobal(panePt); (SELF.Focus; (GlobalToLocal(panePt); {mousePt is now adjusted for the pane's new origin} (SELF.PtToLPt(panePt, mouseLPt); (IF LRectHasLPt(SELF.currentView.extentLRect, mouseLPt) THEN ,CursorAt := SELF.currentView.CursorAt(mouseLPt) (ELSE ,CursorAt := arrowCursor; (PopFocus; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $PROCEDURE {TPane.}GetScrollLimits{(VAR viewedLRect, scrollableLRect: LRect)}; (VAR extra: Point; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (viewedLRect := SELF.viewedLRect; (WITH SELF.currentView DO ,BEGIN ,scrollableLRect := extentLRect; ,extra := scrollPastEnd; ,END; (WITH scrollableLRect, extra DO ,BEGIN ,right := right + Max(0, Min(viewedLRect.right - viewedLRect.left - h, h)); ,bottom := bottom + Max(0, Min(viewedLRect.bottom - viewedLRect.top - v, v)); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sCldInit} $PROCEDURE {TPane.}HaveView{(view: TView)}; (VAR deltaLPt: LPoint; ,viewedLRect: LRect; ,paneSize: Point; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.currentView := view; (IF (view.res.h <> SELF.viewedRes.h) OR (view.res.v <> SELF.viewedRes.v) THEN ,BEGIN ,PtMinusPt(SELF.innerRect.botRight, SELF.innerRect.topLeft, paneSize); ,viewedLRect := view.extentLRect; ,viewedLRect.right := viewedLRect.left + 0LIntDivInt(ORD4(paneSize.h) * view.res.h, SELF.padRes.h); ,viewedLRect.bottom := viewedLRect.top + 0LIntDivInt(ORD4(paneSize.v) * view.res.v, SELF.padRes.v); ,SELF.Redefine(SELF.innerRect, viewedLRect, SELF.padRes, view.res, SELF.zoomFactor, SELF.port); ,END (ELSE ,BEGIN ,SetLPt(deltaLPt, view.extentLRect.left - SELF.viewedLRect.left, =view.extentLRect.top - SELF.viewedLRect.top); ,SELF.OffsetBy(deltaLPt); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sRes} $PROCEDURE {TPane.}MouseTrack{(mPhase: TMousePhase; mousePt: Point)}; ({assumes mousePt is within the pane's innerRect; ,mousePt is window-relative, (0,0)-origined} (VAR mouseLPt: LPoint; ,panePt: Point; {window-relative, under the coordinate system defined by pane} ,currentView: TView; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (PushFocus; (panePt := mousePt; (LocalToGlobal(panePt); (SELF.Focus; (GlobalToLocal(panePt); {mousePt is now adjusted for the pane's new origin} (SELF.PtToLPt(panePt, mouseLPt); (currentView := SELF.currentView; (currentView.MouseTrack(mPhase, mouseLPt); (PopFocus; ({ &&& we should optimize the following -- SELF.CursorAt also does the same focusing as above } (process.ChangeCursor(SELF.CursorAt(mousePt)); ({$IFC fTrace}EP;{$ENDC} $END; {$S sStartup} {+++LSR+++} {This whole method is substantially changed} $PROCEDURE {TPane.}Refresh{(rActions: TActions; highTransit: THighTransit)}; (VAR panel: TPanel; ,needGray: BOOLEAN; ,viewExtentLRect: LRect; ,viewedLRect: LRect; ,tempLRect: LRect; (PROCEDURE HighlightOnThePad; (BEGIN ,panel.selection.Highlight(highTransit); (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (panel := SELF.panel; (viewExtentLRect := SELF.currentView.extentLRect; (viewedLRect := SELF.viewedLRect; (IF rFrame IN rActions THEN ,SELF.Frame; (needGray := (rBackground IN rActions) AND 4((viewedLRect.right > viewExtentLRect.right) OR 5(viewedLRect.bottom > viewExtentLRect.bottom)); (IF rErase IN rActions THEN ,SELF.Erase; (IF (rDraw IN rActions) OR (highTransit <> hNone) OR needGray THEN ,BEGIN ,PushFocus; ,SELF.Focus; ,IF needGray THEN 0BEGIN 0PenNormal; 0PenSize(2, 2); 0{draw the vertical strip of gray ...} 0tempLRect := viewedLRect; 0tempLRect.left := viewExtentLRect.right; 0FillLRect(tempLRect, lPatLtGray); 0{... then the horizontal strip ...} 0tempLRect := viewedLRect; 0tempLRect.top := viewExtentLRect.bottom; 0FillLRect(tempLRect, lPatLtGray); 0{... then frame the bottom right of the view extent with a 2-pixel line outside the extent; 4note that the topLeft does not matter} 0tempLRect.topLeft := viewedLRect.topLeft; 0tempLRect.botRight := viewExtentLRect.botRight; 0InsetLRect(tempLRect, -2, -2); 0FrameLRect(tempLRect); 0END; ,IF rDraw IN rActions THEN 0SELF.currentView.Draw; ,IF highTransit <> hNone THEN 0IF panel.previewMode = mPrvwMargins THEN 4panel.paginatedView.DoOnPages(TRUE, HighlightOnThePad) 0ELSE 4HighlightOnThePad; ,IF rDraw IN rActions THEN {Page breaks after highlighting, in case highlighting doesn't XOR} 0IF panel.previewMode = mPrvwBreaks THEN {Xors automatic as well as manual page breaks} 4SELF.currentView.printManager.DrawBreaks(FALSE); ,PopFocus; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCres} ${$S sRes} $PROCEDURE {TPane.}Resize{(newInnerRect: Rect; vhs: VHSelect)}; (VAR innerRect: Rect; ,paneLongSize: LPoint; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (innerRect := SELF.innerRect; (AlignRect(innerRect, newInnerRect, vhs); (SELF.SetInnerRect(innerRect); (SELF.clippedRect := innerRect; (SELF.DistToLDist(Point(FDiagRect(innerRect)), paneLongSize); "{$H-} LPtPlusLPt(SELF.viewedLRect.topLeft, paneLongSize, SELF.viewedLRect.botRight); {$H+} (SELF.availLRect := SELF.viewedLRect; "{$H-} InsetLRect(SELF.availLRect, -8192, -8192); {$H+} ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $PROCEDURE {TPane.}ScrollBy(VAR deltaLPt: LPoint); (VAR panel: TPanel; ,deltaPt: Point; ,vhs: VHSelect; ,band: TBand; ,tempPt: Point; $BEGIN ({$IFC fTrace}BP(5);{$ENDC} (panel := SELF.panel; (IF panel.panes.Size = 1 THEN ,BEGIN ,PushFocus; ,SELF.panel.window.Focus; ,panel.DoScrolling(SELF, SELF, TRUE, TRUE, deltaLPt); ,IF NOT EqualLPt(deltaLPt, zeroLPt) THEN 0BEGIN 0SELF.OffsetBy(deltaLPt); 0FOR vhs := v TO h DO 4panel.scrollBars[vhs].firstBox.MoveThumb(TBand(panel.bands[vhs].First).ThumbPos); 0END; ,PopFocus; ,END (ELSE ,FOR vhs := v TO h DO 0BEGIN 0band := TBand(panel.ChildWithPt(SELF.innerRect.topLeft, panel.bands[vhs], tempPt)); 0band.ScrollBy(deltaLPt.vh[vhs]); 0END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $PROCEDURE {TPane.}ScrollToReveal(VAR anLRect: LRect; hMinToSee, vMinToSee: INTEGER); (VAR ptMinToSee: Point; ,minToSee: INTEGER; ,viewedLRect: LRect; ,deltaLPt: LPoint; ,vhs: VHSelect; ,lcd: LONGINT; $BEGIN ({$IFC fTrace}BP(5);{$ENDC} (viewedLRect := SELF.viewedLRect; (SetPt(ptMinToSee, hMinToSee, vMinToSee); (FOR vhs := v TO h DO ,BEGIN ,minToSee := Min(LengthRect(SELF.innerRect, vhs), ptMinToSee.vh[vhs]); ,lcd := anLRect.topLeft.vh[vhs] + minToSee - viewedLRect.botRight.vh[vhs]; ,IF lcd <= 0 THEN 0BEGIN 0lcd := anLRect.botRight.vh[vhs] - minToSee - viewedLRect.topLeft.vh[vhs]; 0IF lcd >= 0 THEN 4lcd := 0; 0END; ,deltaLPt.vh[vhs] := lcd; ,END; (SELF.ScrollBy(deltaLPt); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCcld} $PROCEDURE {TPane.}SetZoomFactor{(zoomNumerator, zoomDenominator: Point)}; (VAR zoomFactor: TScaler; ,newLRight: LONGINT; ,newLBottom: LONGINT; ,newViewedLRect: LRect; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (Reduce(zoomNumerator.h, zoomDenominator.h); {reduce to lowest terms} (Reduce(zoomNumerator.v, zoomDenominator.v); '{adjust viewed lRect} (newLRight := Min( ,(SELF.viewedLRect.right * zoomDenominator.h * SELF.zoomFactor.numerator.h) 0DIV ( zoomNumerator.h * SELF.zoomFactor.denominator.h), -SELF.currentView.extentLRect.right); (newLBottom := Min( ,(SELF.viewedLRect.bottom * zoomDenominator.v * SELF.zoomFactor.numerator.v) /DIV ( zoomNumerator.v * SELF.zoomFactor.denominator.v), -SELF.currentView.extentLRect.bottom); (SetLRect(newViewedLRect, SELF.viewedLRect.left, SELF.viewedLRect.top, 2newLRight, newLBottom); (SetPt(zoomFactor.numerator, zoomNumerator.h, zoomNumerator.v); (SetPt(zoomFactor.denominator, zoomDenominator.h, zoomDenominator.v); (SELF.Redefine(SELF.innerRect, newViewedLRect, SELF.padRes, SELF.viewedRes, zoomFactor, SELF.port); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} {$S SgABCini} END; {$S SgABCres} METHODS OF TMarginPad; ${$S SgABCini} $FUNCTION {TMarginPad.}CREATE{(object: TObject; heap: THeap): TMarginPad}; (VAR bodyPad: TBodyPad; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TMarginPad(object); (bodyPad := TBodyPad.CREATE(NIL, heap, SELF); (SELF.bodyPad := bodyPad; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCpri} $PROCEDURE {TMarginPad.}Rework{(itsView: TView; itsOrigin: Point; itsRes: Point; 7itsPageNumber: LONGINT; itsZoomFactor: TScaler; itsPort: GrafPtr)}; (VAR itsViewedLRect: LRect; ,printerMetrics: TPrinterMetrics; ,bodyPad: TBodyPad; ,innerRect: Rect; (PROCEDURE ScaleToPadSpace(printRect: Rect; VAR padRect: Rect); ,VAR padLRect: LRect; ({NB: itsOrigin is a free var in this proc} (BEGIN (SetLRect(padLRect, ,LIntOvrInt(ORD4(printRect.left) * itsRes.h * itsZoomFactor.numerator.h, {this whole stmt} =printerMetrics.res.h * itsZoomFactor.denominator.h), ,LIntOvrInt(ORD4(printRect.top) * itsRes.v * itsZoomFactor.numerator.v, =printerMetrics.res.v * itsZoomFactor.denominator.v), ,LIntOvrInt(ORD4(printRect.right) * itsRes.h * itsZoomFactor.numerator.h, =printerMetrics.res.h * itsZoomFactor.denominator.h), ,LIntOvrInt(ORD4(printRect.bottom) * itsRes.v * itsZoomFactor.numerator.v, =printerMetrics.res.v * itsZoomFactor.denominator.v)); (noPad.LRectToRect(padLRect, padRect); (OffsetRect(padRect, itsOrigin.h, itsOrigin.v); (END; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.view := itsView; (printerMetrics := SELF.view.printManager.printerMetrics; (SELF.pageNumber := itsPageNumber; (ScaleToPadSpace(printerMetrics.paperRect, innerRect); (SELF.Redefine(innerRect, SELF.view.printManager.paperLRect, @itsRes, {pad resolutions} @itsView.res, {viewed resolutions} @itsZoomFactor, itsPort); {calls TPad's Redefine method} &{page's 'viewed space' has same metrics as the owning view's} (SELF.bodyPad.Recompute; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCini} $PROCEDURE {TMarginPad.}Free; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (Free(SELF.bodyPad); (TObject.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCpri} $PROCEDURE {TMarginPad.}SetForPage{(itsPageNumber: LONGINT; itsOrigin: Point)}; (VAR innerRect: Rect; ,newOffset: LPoint; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.pageNumber := itsPageNumber; (innerRect := SELF.innerRect; (OffsetRect(innerRect, itsOrigin.h - SELF.innerRect.left, itsOrigin.v - SELF.innerRect.top); (SELF.SetInnerRect(innerRect); (SELF.clippedRect := innerRect; (WITH innerRect DO ,SetLPt(newOffset, - left, - top); (SELF.SetScrollOffset(newOffset); (SELF.bodyPad.SetForPage(itsPageNumber); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TMarginPad.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN (TPad.Fields(Field); (Field('view: TView'); (Field('pageNumber: LONGINT'); (Field('bodyPad: TBodyPad'); (Field(''); $END; ${$S SgABCres} ${$ENDC} ${$IFC fDbgABC} ${$S SgABCdbg} $FUNCTION TMarginPad.BindHeap{(activeVsClip, doBind: BOOLEAN): THeap}; {called by HeapDump in UOBJECT2} $BEGIN ({$IFC fMaxTrace}BP(1);{$ENDC} ({$IFC fMaxTrace}EP;{$ENDC} (BindHeap := NIL; $(* IF activeWindowID <> 0 THEN {don't allow inactive windows to use this} -- WHY NOT???? *) ,BEGIN ,IF activeVsClip THEN 0BEGIN $(* IF (currentDocument <> NIL) AND doBind THEN 4BindHeap := currentDocument.docHeap; *) 0IF (boundDocument <> NIL) AND doBind THEN 4BindHeap := boundDocument.docHeap; 0END ,ELSE ,IF currentDocument <> clipboard THEN 0IF doBind THEN 4BEGIN 4hadToBindClip := boundClipboard = NIL; 4IF hadToBindClip THEN 8clipboard.Bind; 4BindHeap := clipboard.docHeap; 4END 0ELSE IF hadToBindClip THEN 4clipboard.Unbind; ,END; $END; ${$S SgABCres} ${$ENDC} ${$S SgABCcld} $PROCEDURE {TMarginPad.}Crash; $BEGIN {SELF = crashPad, presumably, but in any case, someone wants this process to die, so...} (IF isInitialized THEN ,process.Complete(FALSE); $END; ${$S SgABCres} $PROCEDURE TMarginPad.SetScrollOffset(VAR newOffset: LPoint); {+SW+} $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF fExperimenting OR NOT amPrinting THEN ,SUPERSELF.SetScrollOffset(newOffset) (ELSE ,WITH SELF DO 0BEGIN 0scrollOffset := newOffset; 0origin := zeroPt; 0cdOffset := newOffset; 0END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCini} END; {$S SgABCres} METHODS OF TBodyPad; ${$S SgABCini} $FUNCTION {TBodyPad.}CREATE{(object: TObject; heap: THeap; itsMarginPad: TMarginPad): TBodyPad}; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TBodyPad(object); (SELF.marginPad := itsMarginPad; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TBodyPad.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN (TPad.Fields(Field); (Field('marginPad: TMarginPad'); (Field('nonNullBody: Rect'); $END; ${$S SgABCres} ${$ENDC} ${$S SgABCpri} $PROCEDURE {TBodyPad.}Focus; $BEGIN ({$IFC fTrace}BP(6);{$ENDC} (SELF.ClipFurtherTo(SELF.nonNullBody); (TPad.Focus; '{$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCpri} $PROCEDURE {TBodyPad.}Recompute; (VAR myViewedLRect: LRect; ,myInnerRect: Rect; ,view: TView; ,marginPad: TMarginPad; ,bodyRect: Rect; ,printManager: TPrintManager; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (marginPad := SELF.marginPad; (view := marginPad.view; (printManager := view.printManager; (printManager.GetPageLimits(marginPad.pageNumber, myViewedLRect); (marginPad.LRectToRect(printManager.contentLRect, myInnerRect); (WITH marginPad.origin DO {$H-} ,OffsetRect(myInnerRect, -h, -v); {$H+} (SELF.Redefine(myInnerRect, myViewedLRect, marginPad.padRes, *view.res, marginPad.zoomFactor, SELF.marginPad.port); (bodyRect.topLeft := SELF.innerRect.topLeft; (SELF.LPtToPt(myViewedLRect.botRight, bodyRect.botRight); (bodyRect.botRight := Point(FPtMinusPt(bodyRect.botRight, SELF.origin)); (SELF.nonNullBody := bodyRect; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCpri} $PROCEDURE {TBodyPad.}SetForPage{(itsPageNumber: LONGINT)}; (VAR myViewedLRect: LRect; ,myInnerRect: Rect; ,bodyRect: Rect; ,printManager: TPrintManager; ,newOffset: LPoint; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (printManager := SELF.marginPad.view.printManager; (printManager.GetPageLimits(itsPageNumber, myViewedLRect); (SELF.marginPad.LRectToRect(printManager.contentLRect, myInnerRect); (WITH SELF.marginPad.origin DO {$H-} ,OffsetRect(myInnerRect, -h, -v); {$H+} (SELF.SetInnerRect(myInnerRect); (WITH SELF, newOffset, scaleFactor DO ,BEGIN ,viewedLRect := myViewedLRect; ,availLRect := myViewedLRect; &{$H-} InsetLRect(availLRect, -8192, -8192); {$H+} ,clippedRect := myInnerRect; ,IF scaled THEN 0BEGIN &{$H-} h := LIntOvrInt(LIntMulInt(myViewedLRect.left, numerator.h), denominator.h) {+++LSR+++} 9- myInnerRect.left; 0v := LIntOvrInt(LIntMulInt(myViewedLRect.top, numerator.v), denominator.v) {+++LSR+++} 8- myInnerRect.top; {$H+} 0END ,ELSE 0BEGIN 0h := myViewedLRect.left - myInnerRect.left; 0v := myViewedLRect.top - myInnerRect.top; 0END; ,END; (SELF.SetScrollOffset(newOffset); (SELF.nonNullBody := SELF.innerRect; {$H-} SELF.LPtToPt(myViewedLRect.botRight, SELF.nonNullBody.botRight); (SELF.nonNullBody.botRight := Point(FPtMinusPt(SELF.nonNullBody.botRight, SELF.origin)); {$H+} ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} $PROCEDURE TBodyPad.SetScrollOffset(VAR newOffset: LPoint); {+SW+} $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF fExperimenting OR NOT amPrinting THEN ,SUPERSELF.SetScrollOffset(newOffset) (ELSE ,WITH SELF DO 0BEGIN 0scrollOffset := newOffset; 0origin := zeroPt; 0cdOffset := newOffset; 0END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCini} END; {$S SgABCres} METHODS OF TScroller; ${$S sCldInit} $FUNCTION {TScroller.}CREATE{(object: TObject; heap: THeap; itsScrollBar: TScrollBar; itsId: TSBoxID) A:TScroller}; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TScroller(object); (WITH SELF DO ,BEGIN ,scrollBar := itsScrollBar; ,band := NIL; ,sBoxID := itsId; &{$H-} SetSbRefcon(POINTER(sBoxID), ORD(SELF)); {$H+} ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S SgABCini} $PROCEDURE {TScroller.}Free; (VAR sbList: TSbList; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (PreSbList(sbList, SELF.scrollBar); "{$H-} KillSb(sbList, POINTER(SELF.sBoxID)); {$H+} (PostSbList(sbList, SELF.scrollBar); (TObject.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$IFC fDebugMethods} ${$S SgABCdbg} $PROCEDURE {TScroller.}Fields{(PROCEDURE Field(nameAndType: S255))}; $BEGIN 'Field('scrollBar: TScrollBar'); 'Field('band: TBand'); 'Field('sBoxID: LONGINT'); $END; ${$S SgABCres} ${$ENDC} ${$S sScroll} $PROCEDURE {TScroller.}FillIcon{(icon: TEnumIcons; fBlack: BOOLEAN)}; (TYPE TIconAlias = 0RECORD 0CASE INTEGER OF 41: (sblib: TIcon); 42: (abc: TEnumIcons); 0END; (VAR iconAlias: TIconAlias; $BEGIN ({$IFC fMaxTrace}BP(1);{$ENDC} ({$IFC fMaxTrace}EP;{$ENDC} (iconAlias.abc := icon; (PaintArw(POINTER(SELF.sBoxID), iconAlias.sblib, fBlack); $END; ${$S sRes} $PROCEDURE {TScroller.}GetSize{(VAR boxRect: Rect)}; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (GetSbRect(POINTER(SELF.sBoxID), boxRect); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $PROCEDURE {TScroller.}MoveThumb{(newThumbPos: INTEGER)}; ({NOTE: assumes we are focused on the window, NOT on a pane} $BEGIN ({$IFC fTrace}BP(4);{$ENDC} (IF activeWindowID <> 0 THEN ,BEGIN ,SetupMvThumb(POINTER(SELF.sboxID)); ,MoveThumb(newThumbPos); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sSplit} $PROCEDURE {TScroller.}ResplitAt{(newSkwrCd: INTEGER; prevScroller: TScroller)}; (VAR vhs: VHSelect; ,sbRect: Rect; ,prevSbRect: Rect; ,hsb: THSb; ,deltaCd: INTEGER; ,minSize: INTEGER; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (vhs := SELF.ScrollDir; (minSize := dptSkewer.vh[vhs]; (hsb := POINTER(SELF.sBoxID); (GetSbRect(hsb, sbRect); (prevScroller.GetSize(prevSbRect); ({If either scroller to becomes too small, delete it} (IF newSkwrCd <= prevSbRect.topLeft.vh[vhs] + minSize THEN ,newSkwrCd := prevSbRect.topLeft.vh[vhs] (ELSE IF newSkwrCd >= sbRect.botRight.vh[vhs] - minSize THEN ,newSkwrCd := sbRect.botRight.vh[vhs]; (deltaCd := newSkwrCd - sbRect.topLeft.vh[vhs]; (AdjSplitBetween(POINTER(prevScroller.sBoxID), hsb, deltaCd); ({$IFC fTrace}EP;{$ENDC} $END; ${$S SgABCres} ${$S sRes} $FUNCTION {TScroller.}ScrollDir{: VHSelect}; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (ScrollDir := TyVHOfSb(POINTER(SELF.sBoxID)); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sRes} $PROCEDURE {TScroller.}SetSize{(ownerRect: Rect)}; (VAR sbRect: Rect; ,vhs: VHSelect; ,width: INTEGER; 0{ownerRect is the band's outerRect. 1For v bar: top/bottom = ownerRect top/bottom  hsbNil DO ,BEGIN ,scroller := TScroller(RefconSb(hsb)); ,IF scroller.band <> NIL THEN 0bandOuterRect := scroller.band.outerRect; ,scroller.SetSize(bandOuterRect); ,SetSbIcons(hsb, icons); ,hsb := HsbNext(hsb); ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sScroll} $FUNCTION {TScrollBar.}DownAt{(mousePt: Point; VAR scroller: TScroller; VAR icon: TEnumIcons): BOOLEAN}; (TYPE TIconAlias = 0RECORD 0CASE INTEGER OF 41: (sblib: TIcon); 42: (abc: TEnumIcons); 0END; (VAR iconAlias: TIconAlias; ,hsbHit: THSb; ,sbList: TSbList; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (DownAt := FALSE; (IF SELF.isVisible THEN ,BEGIN ,PreSbList(sbList, SELF); &{$H-} IF FSbHit(sbList, mousePt, hsbHit, iconAlias.sbLib) {$H+} THEN 0BEGIN 0DownAt := TRUE; 0scroller := POINTER(RefconSb(hsbHit)); 0icon := iconAlias.abc; 0END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TScrollBar.}Draw; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF SELF.isVisible THEN ,PaintSbar(POINTER(SELF.firstBox.sBoxID)); ({$IFC fTrace}EP;{$ENDC} $END; ${$S sStartup} $PROCEDURE {TScrollBar.}Erase; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (IF SELF.isVisible THEN ,EraseSBar(POINTER(SELF.firstBox.sBoxID)); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgABCini} END; {$S SgABCres} {$S SgABCini} Kb? TK Source 2̆V{t̆^KY :a$kTk\:)$ "#." #"##%& ! .3. "6F^9geD!$ǐ^ln{#{#tLct; heap: THeap; itsView: TView; (itsLegendHeading: TLegendHeading): TLgHdngLayoutBox; $FUNCTION TLgHdngLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TLgHdngLayoutBox.Draw; OVERRIDE; $PROCEDURE TLgHdngLayoutBox.MousePress(mouseLPT: LPoint); OVERRIDE; $PROCEDURE TLgHdngLayoutBox.Move(deltaLPt: LPoint); OVERRIDE; $PROCEDURE TLgHdngLayoutBox.RecalcExtent; OVERRIDE; $END; VAR $stdFrameBorder(* >>>>>>>> U D I A L O G <<<<<<<< *) {$SETC forOS := TRUE} UNIT UDialog; {Copyright 1984 by Apple Computer, Inc} {04/25/84 0015 Added field TEditLegendSelection.tripleClick, and methods TEditLegendSelection. 5MousePress, MouseMove, and MouseRelease} {04/23/84 1210 Removed all references to 'underEdit' field of TDialogImage} {$Setc IsIntrinsic := TRUE } {$IFC IsIntrinsic} INTRINSIC; {$ENDC} INTERFACE USES "{$U libtk/UObject} UObject, {$IFC LibraryVersion <= 20} "{$U UFont} UFont, {$ENDC} "{$U QuickDraw} QuickDraw, "{$U libtk/UDraw} UDraw, "{$U libtk/UABC} UABC, "{$U libtk/UUnivText} UTKUniversalText, "{$U libtk/UText} UText; CONST $UDialogVersion = 'UDialog 25Apr84 16:30'; (* :----- Dialog Building Block for the ToolKit ------ The Dialog Building Block provides the following standard kinds of dialog Images: 'Button A Lisa-style button (a round-cornered Rectangle for pushing, with text inside it) 'Checkbox A checkbox (a box for checking, plus an optional associated textual label) 'Cluster A set of related checkboxes of which only one is selected at a time 'InputFrame A place for keyboard input to be inhaled 'Legend A character string, together with font & face information 'TextDialogImage A box of text managed by the Text editor (largely untested) 'PicObject A QuickDraw picture (never tested; probably not bankable; status uncertain) The basic bankable dialog entity which can be stashed into/retrieved from a Resource File is the class TDialog. For each different kind of dialog box you want, you will typically define another subclass of TDialog. To EDIT a dialog interactively, you must: &(1) Have the menu items 'Edit Dialog' and 'Stop Editing Dialog' in your phrase-file &(2) If the dialog is viewed in your main window rather than in a dialog box, (such as Preferences) -then your own main Window.CanDoCmd should enable uEditDialog whenever the dialog to be editted -is unambiguously selected in the window and there is not a dialog box up; in this -case, the dialog editting takes place in a dialog box whereas the dialog itself resides -in the main window. &CAUTION: Until Resource Files are incoporated, the edits to a dialog are local to the document /in which you made the edits, as well as documents made from a stationery pad made from /that document. #How to have your own view be a subclass of TDialogView, and still do all of its normal View things, #while having the Dialog Building Block handle everything that occurs which is relevant to #its dialogs: $(a) To draw the non-dialog parts of the view, implement method TDialogView.XDraw $(b) To set the cursor in the non-dialog parts of the view, implement method TDialogView.XCursorAt $(c) Implement XMousePress, XMouseMove, and XMouseRelease instead of their non-x counterparts *) TYPE S4 = STRING[4]; TId = STRING[IDLength]; TButtonMetrics = $RECORD (height: INTEGER; (curvH: INTEGER; (curvV: INTEGER; (typeStyle: TTypeStyle; (expandNum: INTEGER; {a button's min width is its text's with times this numerator} (expandDen: INTEGER; { ... divided by this denominator} (absMinWidth: INTEGER; (penState: PenState; {for drawing the round-rect} $END; TStringKey = RECORD {Keys for Dialogs in Resource Files} 4trueKey: LONGINT; 4key: S4; 0END; {-------------------------------------------------------------------------------------------------------} D{ ********* CLASSES ********* } { -------------------------------- classes implemented in file UDialog2 ------------------------------- } TDialogWindow = SUBCLASS of TDialogBox {which itself is in UABC} $controlPanel: TPanel; {One with a dialogView in it; may be told to push its dflt button} $dialogView: TDialogView; {the view installed in SELF.controlPanel} $mainDialog: TDialog; {the first dialog installed in SELF.dialogView} #{Creation/Destruction} %FUNCTION TDialogWindow.CREATE(object: TObject; heap: THeap; itsResizability: BOOLEAN; (itsHeight: INTEGER; itsKeyResponse, itsMenuResponse, itsDownInMainWindowResponse: TDiResponse) B: TDialogWindow; #{Showing and Hiding} $PROCEDURE TDialogWindow.Appear; OVERRIDE; $PROCEDURE TDialogWindow.BeDismissed; OVERRIDE; $FUNCTION TDialogWindow.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; OVERRIDE; $PROCEDURE TDialogWindow.Disappear; OVERRIDE; #{Commands} $FUNCTION TDialogWindow.NewCommand(cmdNumber: TCmdNumber): TCommand; OVERRIDE; "END; {TDialogWindow interface} {-------------------------------------------------------------------------------------------------------} TDialogView = SUBCLASS OF TView {a view which contains dialog images as well as, possibly, other things} $rootDialog: TDialog; {The children of this object are the constituent Dialogs of this view} $nonDialogExtent: LRect; {intinsic overall extent, dialog + non-dialog actually} $currentDialogImage: TDialogImage; {which descendent owns the mouse during drag} $defaultButton: TButton; {which if any button is the default} $hitButton: TButton; {which Button was last chosen} $isShowing: BOOLEAN; {used to suppress meaningless screen actions for not-yet-showing box} $paintFreeBoxes: BOOLEAN; {whether free-checkboxes are to be painted in one sense only} $paintSense: BOOLEAN; { ... and if so, in which sense } $startedPainting: BOOLEAN; {whether we've begun to paint and hence established paintSense} $styleSheet: TStyleSheet; {for use by text images seen in the view} $mouseIsDown: BOOLEAN; $magnetCursor: TCursorNumber; {to force CursorAt to return this value until mouseIsDown is FALSE} { *** Public Interface *** } "{Creation/Destruction} $FUNCTION TDialogView.CREATE(object: TObject; heap: THeap; itsExtentLRect: LRect; itsPanel: TPanel; +itsPrintManager: TPrintManager; itsRes: Point): TDialogView; $PROCEDURE TDialogView.Free; OVERRIDE; "{Installing, Removing, Activating, Deactivating dialogs} $PROCEDURE TDialogView.AddDialog(dialog: TDialog); $FUNCTION TDialogView.AddNewDialog(itsKey: S4): TDialog; $PROCEDURE TDialogView.ActivateDialog(dialog: TDialog; whichWay: BOOLEAN); $PROCEDURE TDialogView.RemoveDialog(dialog: TDialog; andFree: BOOLEAN); $PROCEDURE TDialogView.ReplaceDialog(oldDialog, newDialog: TDialog); "{Methods which client should redefine to get a dialogView also to have non-dialog behaviour} $FUNCTION TDialogView.XCursorAt(mouseLPt: LPoint): TCursorNumber; DEFAULT; $PROCEDURE TDialogView.XDraw; DEFAULT; $PROCEDURE TDialogView.XMousePress(mouseLPt: LPoint); DEFAULT; $PROCEDURE TDialogView.XMouseMove(mouseLPt: LPoint); DEFAULT; $PROCEDURE TDialogView.XMouseRelease; DEFAULT; {Buttons and checkboxes} $PROCEDURE TDialogView.AbandonThatButton; $PROCEDURE TDialogView.ButtonPushed(button: TButton); {normally, TDialog's ButtonPushed is used} $PROCEDURE TDialogView.CheckboxHit(checkbox: TCheckbox; toggleDirection: BOOLEAN); $PROCEDURE TDialogView.PushButton(button: TButton); {client or ToolKit may call} $PROCEDURE TDialogView.SetDefaultButton(button: TButton); %{NB: PushButton sets the dialogView's hitButton to the requested button, assures that it ,is highlighted, and then calls the client's ButtonPushed method of the TDialog which ,is the parent of the button} { *** Private Interface *** (Methods not expected to be redefined or called by client)} $FUNCTION TDialogView.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TDialogView.Draw; OVERRIDE; $PROCEDURE TDialogView.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); OVERRIDE; $PROCEDURE TDialogView.MouseMove(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TDialogView.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TDialogView.MouseRelease; OVERRIDE; $PROCEDURE TDialogView.RecalcExtent; OVERRIDE; END; {TDialogView interface} {-------------------------------------------------------------------------------------------------------} TDialogImage = SUBCLASS OF TImage $parent: TDialogImage; $isActive: BOOLEAN; $isEditable: BOOLEAN; $withID: BOOLEAN; {Creation/destruction} $FUNCTION TDialogImage.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; 0itsView: TView; withChildren: BOOLEAN): TDialogImage; $PROCEDURE TDialogImage.ControlHit(control: TDialogImage; toggleDirection: BOOLEAN); DEFAULT; $FUNCTION TDialogImage.DownAt(mouseLPt: LPoint): TDialogImage; DEFAULT; $PROCEDURE TDialogImage.Draw; OVERRIDE; $PROCEDURE TDialogImage.DrawJustMe; {called by Draw after children, if any, are told to draw} DEFAULT; $FUNCTION TDialogImage.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TDialogImage.PrepareToAppear; $PROCEDURE TDialogImage.RecalcExtent; OVERRIDE; $FUNCTION TDialogImage.StillMyMouse(mouseLPt: LPoint): BOOLEAN; DEFAULT; #{The following methods are stubs, redefined in TImageWithID} $PROCEDURE TDialogImage.AddImage(dialogImage: TDialogImage); DEFAULT; $PROCEDURE TDialogImage.ActivateImage(dialogImage: TDialogImage; whichWay: BOOLEAN); DEFAULT; $PROCEDURE TDialogImage.BringToFront(dialogImage: TDialogImage); DEFAULT; $PROCEDURE TDialogImage.ComeForward; DEFAULT; $PROCEDURE TDialogImage.DeleteImage(dialogImage: TDialogImage; andFree: BOOLEAN); DEFAULT; $PROCEDURE TDialogImage.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); OVERRIDE; $FUNCTION TDialogImage.HasId(id: S255): BOOLEAN; DEFAULT; $FUNCTION TDialogImage.ObjectWithIDNumber(idNumber: INTEGER): TDialogImage; DEFAULT; $FUNCTION TDialogImage.ObjWithId(id: S255): TDialogImage; DEFAULT; $PROCEDURE TDialogImage.ReplaceImage(replacee, newValue: TDialogImage); DEFAULT; $END; TImageWithID = SUBCLASS OF TDialogImage {same interface as TDialogImage, basically} $children: TList; {of TDialogImage} $id: TId; $idNumber: INTEGER; $FUNCTION TImageWithID.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; 0itsView: TView; withChildren: BOOLEAN): TImageWithID; $FUNCTION TImageWithID.Clone(heap: THeap): TObject; OVERRIDE; $PROCEDURE TImageWithID.Free; OVERRIDE; $PROCEDURE TImageWithID.AddImage(dialogImage: TDialogImage); OVERRIDE; $PROCEDURE TImageWithID.ActivateImage(dialogImage: TDialogImage; whichWay: BOOLEAN); OVERRIDE; $PROCEDURE TImageWithID.BringToFront(dialogImage: TDialogImage); OVERRIDE; $FUNCTION TImageWithID.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TImageWithID.DeleteImage(dialogImage: TDialogImage; andFree: BOOLEAN); OVERRIDE; $PROCEDURE TImageWithID.Draw; OVERRIDE; $PROCEDURE TImageWithID.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); OVERRIDE; $PROCEDURE TImageWithID.EachVirtualPart(PROCEDURE DoToObject(filteredObj: TObject)); OVERRIDE; $FUNCTION TImageWithID.HasId(id: S255): BOOLEAN; OVERRIDE; $PROCEDURE TImageWithID.HaveView(view: TView); OVERRIDE; $FUNCTION TImageWithID.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $FUNCTION TImageWithID.ObjectWithIDNumber(idNumber: INTEGER): TDialogImage; OVERRIDE; $FUNCTION TImageWithID.ObjWithId(id: S255): TDialogImage; OVERRIDE; $PROCEDURE TImageWithID.OffSetBy(deltaLPt: LPoint); OVERRIDE; $PROCEDURE TImageWithID.RecalcExtent; OVERRIDE; $PROCEDURE TImageWithID.ReplaceImage(replacee, newValue: TDialogImage); OVERRIDE; $FUNCTION TImageWithID.StillMyMouse(mouseLPt : LPoint): BOOLEAN; OVERRIDE; $END; {-------------------------------------------------------------------------------------------------------} TDialog = SUBCLASS OF TImageWithID $stringKey: TStringKey; {essentially a unique 4-character ID by which this dialog is known} {Creation} $FUNCTION TDialog.CREATE(object: TObject; heap: THeap; itsKey: S4; itsView: TView): TDialog; {Creation of the basic dialog elements:} "{Elements originating from phrase file; in each case, the text for the legend associated with the (component, if any, as well as a LOCATION for the component, are obtained from the same entry (in the phrase file, with the syntax ,@, )EXAMPLE: Suppose the following 2 lines are in the Phrase File: 0449 0Next@430,50 (If we call NewButton(449, ...), then a button is created, with the text 'Next' inside it; (the button is given idNumber 449, and is located at (430, 50)} {***************************** PUBLIC INTERFACE -- USE THESE METHODS ************************************} $FUNCTION TDialog.NewButton(itsPhrase: INTEGER; itsMetrics: TButtonMetrics; sameSizedButton: TButton; 4itsCmdNumber: TCmdNumber): TButton; $FUNCTION TDialog.NewCluster(itsPhrase: INTEGER): TCluster; $FUNCTION TDialog.NewFreeCheckbox(itsPhrase: INTEGER; boxWidth: INTEGER; (boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle): TCheckBox; $FUNCTION TDialog.NewInputFrame(itsPhrase: INTEGER; promptTypeStyle: TTypeStyle; ,inputOffset: Point; inputTypeStyle: TTypeStyle; ,maxInputChars: INTEGER; itsBorders: Rect; drawInputLRect: BOOLEAN; ,drawHitLRect: BOOLEAN): TInputFrame; $FUNCTION TDialog.NewLegend(itsPhrase: INTEGER; itsTypeStyle: TTypeStyle): TLegend; $FUNCTION TDialog.NewRowOfBoxes(itsPhrase: INTEGER; numberOfBoxes: INTEGER; (startingIDNumber: INTEGER; boxWidth: INTEGER; boxHeight: INTEGER; boxSpacing: INTEGER): TCluster; "{controls} $PROCEDURE TDialog.ButtonPushed(button: TButton); DEFAULT; {client overrides often} $PROCEDURE TDialog.CheckboxHit(checkbox: TCheckbox; toggleDirection: BOOLEAN); DEFAULT; I{client overrides sometimes} $PROCEDURE TDialog.ControlHit(control: TDialogImage; toggleDirection: BOOLEAN); OVERRIDE; $PROCEDURE TDialog.PushButton(button: TButton); {client or ToolKit may call} $PROCEDURE TDialog.SelectInputFrame(inputFrame: TInputFrame); $PROCEDURE TDialog.SetDefaultButton(button: TButton); {************************************** PRIVATE INTERFACE **********************************************} {These methods of TDialog are largely either for internal use of the building block, or maintained for backward compatability with earlier versions of the dialog building block} "{"Standard" elements:} $FUNCTION TDialog.AddStdButton(itsId: S255; itsXLoc, itsYLoc: LONGINT; sameSizedButton: TButton; LitsCmdNumber: TCmdNumber): TButton; $PROCEDURE TDialog.AddOKButton(cmdNumber: TCmdNumber); {OK Button} $PROCEDURE TDialog.AddCancelButton(cmdNumber: TCmdNumber); {Cancel Button} $FUNCTION TDialog.AddStdCluster(itsId: S255; itsXLoc, itsYLoc: LONGINT): TCluster; $FUNCTION TDialog.AddStdFreeCheckbox(itsId: S255; itsXLoc, itsYLoc: LONGINT): TCheckBox; $FUNCTION TDialog.AddStdInputFrame(itsId: S255; itsXLoc: LONGINT; LitsYLoc: LONGINT; maxInputChars : INTEGER): TInputFrame; $FUNCTION TDialog.AddStdLegend(itsId: S255; itsXLoc, itsYLoc: LONGINT; LitsTypeStyle: TTypeStyle): TLegend; $FUNCTION TDialog.AddSysLegend(itsId: S255; itsXLoc, itsYLoc: LONGINT): TLegend; "{General creation of dialogImages} $FUNCTION TDialog.AddButton(itsId: S255; itsLocation: LPoint; itsMetrics: TButtonMetrics; LsameSizedButton: TButton; itsCmdNumber: TCmdNumber): TButton; $FUNCTION TDialog.AddFreeCheckbox(itsID: S255; itsXLoc, itsYLoc: LONGINT; boxWidth: INTEGER; (boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle): TCheckbox; $FUNCTION TDialog.AddBigFreeCheckbox(itsId: S255; itsXLoc, itsYLoc: LONGINT): TCheckbox; $FUNCTION TDialog.AddRowOfBoxes(itsID: S255; itsXLoc, itsYLoc: LONGINT; numberOfBoxes: INTEGER; (startingIDNumber: INTEGER; boxWidth: INTEGER; boxHeight: INTEGER; boxSpacing: INTEGER): TCluster; $FUNCTION TDialog.AddInputFrame(itsId: S255; ,promptLocation: LPoint; promptTypeStyle: TTypeStyle; ,inputLocation: LPoint; inputTypeStyle: TTypeStyle; ,maxInputChars: INTEGER; itsBorders: Rect; drawInputLRect: BOOLEAN; ,drawHitLRect: BOOLEAN): TInputFrame; $FUNCTION TDialog.DownAt(mouseLPt: LPoint): TDialogImage; OVERRIDE; $PROCEDURE TDialog.RecalcExtent; OVERRIDE; $END; {-------------------------------------------------------------------------------------------------------} TButton = SUBCLASS OF TImageWithID $cmdNumber: TCmdNumber; $minWidth: INTEGER; $isHighlighted: BOOLEAN; $nextSameSizedButton: TButton; $legend: TLegend; $buttonMetrics: TButtonMetrics; {Creation/Destruction} $FUNCTION TButton.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; )itsLocation: LPoint; itsMetrics: TButtonMetrics; sameSizedButton: TButton; )itsCmdNumber: TCmdNumber): TButton; $PROCEDURE TButton.DrawJustMe; OVERRIDE; $PROCEDURE TButton.Highlight(highTransit: THighTransit); $FUNCTION TButton.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TButton.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TButton.MouseRelease; OVERRIDE; $PROCEDURE TButton.RecalcExtent; OVERRIDE; $PROCEDURE TButton.Recompute(minWidth: INTEGER); $FUNCTION TButton.StillMyMouse(mouseLPt: LPoint): BOOLEAN; OVERRIDE; END; {TButton interface} {-------------------------------------------------------------------------------------------------------} TCheckbox = SUBCLASS of TImageWithID $isSelected: BOOLEAN; $rectImage: TRectImage; {also a child} $legend: TLegend; {if nonnil, also a child} $FUNCTION TCheckbox.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; (itsLocation: LPoint; boxWidth: INTEGER; boxHeight: INTEGER; wantLabel: BOOLEAN; (labelOffset: Point; itsTypeStyle: TTypeStyle): TCheckbox; $PROCEDURE TCheckbox.ChangeLabel(newS255: S255); $FUNCTION TCheckbox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TCheckbox.Draw; OVERRIDE; $FUNCTION TCheckbox.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TCheckbox.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TCheckbox.Toggle; "END; {TCheckbox interface} {-------------------------------------------------------------------------------------------------------} TCluster = SUBCLASS of TImageWithID #{children: TList; (of TCheckbox) } $location: LPoint; {only used for adding the first aligned checkbox} $hitBox: TCheckbox; {which one was just successfully queried by Hit} $hiLitBox: TCheckbox; {which one is highlighted} $lastBox: TCheckBox; {the checkbox most recently added checkbox} $FUNCTION TCluster.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; @itsLocation : LPoint): TCluster; {****** PUBLIC INTERFACE: ****** ****** Create a cluster using TDialog.NewCluster; add checkboxes to it by calling any of the following ****** three methods. To change which box is selected in the cluster programmatically, call SelectBox ****** ****** To find out which box is selected in a cluster, look at cluster.hiLitBox.idNumber} %FUNCTION TCluster.NewAlignedCheckbox(itsPhrase: INTEGER; selectThisOne: BOOLEAN): TCheckbox; %FUNCTION TCluster.NewCheckbox(itsPhrase: INTEGER; boxWidth: INTEGER; 7boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle; 7selectThisOne: BOOLEAN): TCheckbox; %PROCEDURE TCluster.AddRowOfBoxes(numberOfBoxes: INTEGER; startingIDNumber: INTEGER; @boxWidth: INTEGER; boxHeight: INTEGER; boxSpacing: INTEGER); $PROCEDURE TCluster.SelectBox(checkbox: TCheckbox); {select this box, deselecting others} {****** PRIVATE INTERFACE: ****** ****** These remaining methods of TCluster are for primarily for internal use:} $FUNCTION TCluster.AddAlignedCheckbox(itsId: S255; selectThisOne: BOOLEAN): TCheckbox; $FUNCTION TCluster.AddCheckbox(itsID: S255; itsLocation: LPoint; boxWidth: INTEGER; 7boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle; 7selectThisOne: BOOLEAN): TCheckbox; $FUNCTION TCluster.Hit(mouseLPt: LPoint): BOOLEAN; OVERRIDE; $PROCEDURE TCluster.MousePress(mouseLPt: LPoint); OVERRIDE; $FUNCTION TCluster.StillMyMouse(mouseLPt: LPoint): BOOLEAN; OVERRIDE; END; {TCluster interface} {-------------------------------------------------------------------------------------------------------} TInputFrame = SUBCLASS OF TImageWithID $textDialogImage: TTextDialogImage; $prompt: TLegend; $borders: Rect; $drawInputLRect: BOOLEAN; {whether or not to draw a faint box around the input LRect} $drawHitLRect: BOOLEAN; {whether or not to frame the hit rectangle} $maxInputChars: INTEGER; $inputTypeStyle: TTypeStyle; $FUNCTION TInputFrame.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; +promptLocation: LPoint; promptTypeStyle: TTypeStyle; +inputLocation: LPoint; inputTypeStyle: TTypeStyle; maxInputChars: INTEGER; +itsBorders: Rect; drawInputLRect: BOOLEAN; drawHitLRect: BOOLEAN +): TInputFrame; { *********************************************** PUBLIC INTERFACE **************************************** } #{Create an input frame by calling TDialog.NewInputFrame; use GetContents and SupplantContents $to find out what has been typed, and to change what appears in the typing area} $PROCEDURE TInputFrame.GetContents(VAR theStr: S255); {inspect current frame contents} $PROCEDURE TInputFrame.SupplantContents(newStr: S255); {change current frame contents} { ********************************************** PRIVATE INTERFACE **************************************** } $FUNCTION TInputFrame.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TInputFrame.Draw; OVERRIDE; $FUNCTION TInputFrame.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TInputFrame.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TInputFrame.RecalcExtent; OVERRIDE; $FUNCTION TInputFrame.StillMyMouse(mouseLPt: LPoint): BOOLEAN; OVERRIDE; END; {TInputFrame interface} {-------------------------------------------------------------------------------------------------------} TLegend = SUBCLASS OF TDialogImage (location: LPoint; (paragraph: TParagraph; (wouldBeDraggable: BOOLEAN; {whether, during layout, it should itself be draggable} (usesSysFont: BOOLEAN; {whether it is in system font -- a special case} $FUNCTION TLegend.CREATE(object: TObject; heap: THeap; itsChars: S255; itsView: TView; (itsLocation: LPoint; itsTypeStyle: TTypeStyle): TLegend; $PROCEDURE TLegend.Free; OVERRIDE; { *********************************************** PUBLIC INTERFACE **************************************** } $PROCEDURE TLegend.ChangeToPhrase(newPhrase: INTEGER); {for getting new text from phrase file} $PROCEDURE TLegend.ChangeString(newString: S255); {for getting new text from a string} $PROCEDURE TLegend.GetString(VAR itsString: S255); {determine current chars residing in the legend} { ********************************************** PRIVATE INTERFACE **************************************** } $PROCEDURE TLegend.Draw; OVERRIDE; $PROCEDURE TLegend.GetBoxRight; {sets extent based on current chars & location} $FUNCTION TLegend.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TLegend.OffsetBy(deltaLPt: LPoint); OVERRIDE; $PROCEDURE TLegend.RecalcExtent; OVERRIDE; $END; { ------------------------------- classes implemented in file UDialog3 -------------------------------} TPicObject = SUBCLASS OF TImageWithID {An Object which holds a QD Picture File} {CAUTION: totally untested} $picture: PicHandle; $boxAtCreation: Rect; {need to get itsView parameter into all these guys} $FUNCTION TPicObject.CREATE(object: TObject; heap: THeap; itsId: S255; )itsView: TView; itsLocation: LPoint; itsPicHandle: PicHandle): TPicObject; $PROCEDURE TPicObject.Free; OVERRIDE; $PROCEDURE TPicObject.Draw; OVERRIDE; $END; {-------------------------------------------------------------------------------------------------------} "TRectImage = SUBCLASS OF TDialogImage {a rectangle packaged as a object} (penState: PenState; $FUNCTION TRectImage.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; (itsView: TView; itsPenState: PenState; withChildren: BOOLEAN): TRectImage; $PROCEDURE TRectImage.Draw; OVERRIDE; $FUNCTION TRectImage.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $END; {-------------------------------------------------------------------------------------------------------} TTextDialogImage = SUBCLASS OF TImageWithID %textImage: TTextImage; %wouldBeDraggable: BOOLEAN; %refCount: INTEGER; $FUNCTION TTextDialogImage.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; 2itsView: TView; itsTypeStyle: TTypeStyle; 2itsInitialChars: S255): TTextDialogImage; $PROCEDURE TTextDialogImage.Free; OVERRIDE; $PROCEDURE TTextDialogImage.ChangeRefCountBy(delta: INTEGER); $FUNCTION TTextDialogImage.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TTextDialogImage.Draw; OVERRIDE; $FUNCTION TTextDialogImage.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TTextDialogImage.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TTextDialogImage.OffsetBy(deltaLPt: LPoint); OVERRIDE; %END; {-------------------------------------------------------------------------------------------------------} TFrameSelection = SUBCLASS OF TSelection {the phony selection covering TextSelection in an input frame} $inputFrame: TInputFrame; {the input frame in which the selection occurs} $FUNCTION TFrameSelection.CREATE(object: TObject; heap: THeap; itsInputFrame: TInputFrame) D: TFrameSelection; $FUNCTION TFrameSelection.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; OVERRIDE; $PROCEDURE TFrameSelection.KeyChar(ch: CHAR); OVERRIDE; $PROCEDURE TFrameSelection.KeyEnter(dh, dv: INTEGER); OVERRIDE; $PROCEDURE TFrameSelection.KeyReturn; OVERRIDE; $PROCEDURE TFrameSelection.KeyTab(fBackward: BOOLEAN); OVERRIDE; $PROCEDURE TFrameSelection.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TFrameSelection.PerformCommand(command: TCommand; cmdPhase: TCmdPhase); OVERRIDE; $PROCEDURE TFrameSelection.Restore; OVERRIDE; END; {TFrameSelection interface} TPlannerView = SUBCLASS OF TDialogView {a view within which images are laid out} "{Variables} $viewBeingPlanned: TView; $allowSketching: BOOLEAN; {for internal use of the layout mechanism} $retainPickedBox: BOOLEAN; $currentLayoutBox: TLayoutBox; "{Creation/Destruction} $FUNCTION TPlannerView.CREATE(object: TObject; heap: THeap; itsViewBeingPlanned: TView; /itsPanel: TPanel; itsAllowSketching: BOOLEAN; itsRetainPickedBox: BOOLEAN): TPlannerView; $PROCEDURE TPlannerView.Init(itsListOfImages: TList); $FUNCTION TPlannerView.NewLayoutBox(image: TImage): TLayoutBox; {return NIL if element not to be shown} $PROCEDURE TPlannerView.Free; OVERRIDE; "{Display} $PROCEDURE TPlannerView.Draw; OVERRIDE; "{Mouse Tracking} $FUNCTION TPlannerView.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TPlannerView.MouseMove(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TPlannerView.MousePress(mouseLPt: LPoint); OVERRIDE; $PROCEDURE TPlannerView.MouseRelease; OVERRIDE; "{Enumeration of components} $PROCEDURE TPlannerView.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); OVERRIDE; $END; {-------------------------------------------------------------------------------------------------------} $TLayoutBox = SUBCLASS OF TImageWithID ({Variables} (manipulee: TImage; (titleTab: TTitleTab; (suppressDrawingManipulee: BOOLEAN; (isResizable: BOOLEAN; (borders: Rect; (wouldMakeSelection: BOOLEAN; {client must directly set if not wanting default 'FALSE'} (isDraggable: BOOLEAN; (shouldFrame: BOOLEAN; (hasDraggee: BOOLEAN; &{Creation/Destruction} (FUNCTION TLayoutBox.CREATE(object: TObject; heap: THeap; baseExtent: LRect; itsID: S255; ,itsParent: TLayoutBox; itsView: TView; itsManipulee: TImage; itsBorders: Rect; ,itsResizable: BOOLEAN; itsSuppression: BOOLEAN; withChildren: BOOLEAN): TLayoutBox; (PROCEDURE TLayoutBox.Free; OVERRIDE; &{Change and Display} (PROCEDURE TLayoutBox.ChangeDragState(enteringDrag: BOOLEAN); (PROCEDURE TLayoutBox.ConsiderMouse(mouseLPt: LPoint; VAR madeSelection: BOOLEAN; LVAR pickedLayoutBox: TLayoutBox); DEFAULT; (FUNCTION TLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; (PROCEDURE TLayoutBox.Draw; OVERRIDE; (PROCEDURE TLayoutBox.DrawJustMe; OVERRIDE; (PROCEDURE TLayoutBox.FreeManipulee; (PROCEDURE TLayoutBox.Highlight(highTransit: THighTransit); (PROCEDURE TLayoutBox.MousePress(mouseLPT: LPoint); OVERRIDE; (PROCEDURE TLayoutBox.Move(deltaLPt: LPoint); DEFAULT; (FUNCTION TLayoutBox.NoTitleTab(heap: THeap): TTitleTab; (PROCEDURE TLayoutBox.OffsetBy(deltaLPt: LPoint); OVERRIDE; (PROCEDURE TLayoutBox.OffsetLayoutBoxBy(deltaLPt: LPoint; textImageAsWell: BOOLEAN); DEFAULT; (PROCEDURE TLayoutBox.RecalcExtent; OVERRIDE; (PROCEDURE TLayoutBox.Resize(newExtent: LRect); OVERRIDE; (PROCEDURE TLayoutBox.TabGrabbed; DEFAULT; (END; $TLegendLayoutBox = SUBCLASS OF TLayoutBox {manipulee is a TLegend} (textDialogImage: TTextDialogImage; &{Creation/Destruction} (FUNCTION TLegendLayoutBox.CREATE(object: TObject; heap: THeap; itsView: TView; itsLegend: TLegend 0): TLegendLayoutBox; (FUNCTION TLegendLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; (PROCEDURE TLegendLayoutBox.Draw; OVERRIDE; (PROCEDURE TLegendLayoutBox.OffsetBy(deltaLPt: LPoint); OVERRIDE; (PROCEDURE TLegendLayoutBox.OffsetLayoutBoxBy(deltaLPt: LPoint; textImageAsWell: BOOLEAN); OVERRIDE; *{use of the second argument is strange and non self-explanatory; comments in the internal +documentation may help. Nobody should be calling this old boy from outside, anyway} (PROCEDURE TLegendLayoutBox.MousePress(mouseLPT: LPoint); OVERRIDE; (PROCEDURE TLegendLayoutBox.RecalcExtent; OVERRIDE; (END; $TButtonLayoutBox = SUBCLASS OF TLayoutBox {manipulee is a TButton} &{Variables} (nextSameSizedBox: TButtonLayoutBox; (oldLegendTopLeft: LPoint; &{Creation/Destruction} (FUNCTION TButtonLayoutBox.CREATE(object: TObject; heap: THeap; itsButton: TButton; LitsView: TView): TButtonLayoutBox; &{Other Methods} (PROCEDURE TButtonLayoutBox.ConsiderMouse(mouseLPt: LPoint; VAR madeSelection: BOOLEAN; HVAR pickedLayoutBox: TLayoutBox); OVERRIDE; (FUNCTION TButtonLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; (PROCEDURE TButtonLayoutBox.DrawJustMe; OVERRIDE; (PROCEDURE TButtonLayoutBox.OffsetBy(deltaLPt: LPoint); OVERRIDE; (PROCEDURE TButtonLayoutBox.RecalcExtent; OVERRIDE; (PROCEDURE TButtonLayoutBox.RecalcJustMe; (END; $TTitleTab = SUBCLASS OF TImage (layoutBox: TLayoutBox; (legend: TLegend; (shouldDrawLegend: BOOLEAN; {FALSE if string is too wide to fit} (FUNCTION TTitleTab.CREATE(object: TObject; heap: THeap; itsLayoutBox: TLayoutBox; itsHeight: INTEGER; ,itsCaption: S255): TTitleTab; (PROCEDURE TTitleTab.Free; OVERRIDE; (PROCEDURE TTitleTab.Draw; OVERRIDE; (PROCEDURE TTitleTab.OffsetBy(deltaLPt: LPoint); OVERRIDE; (PROCEDURE TTitleTab.Resize(newExtent: LRect); OVERRIDE; (END; $TLayPickSelection = SUBCLASS OF TSelection &{Variables} (layoutBox: TLayoutBox; (FUNCTION TLayPickSelection.CREATE(object: TObject; heap: THeap; itsView: TPlannerView; 9itsKind: INTEGER; itsLayoutBox: TLayoutBox; itsAnchorLPt: LPoint): TLayPickSelection; (FUNCTION TLayPickSelection.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN) P: BOOLEAN; OVERRIDE; (PROCEDURE TLayPickSelection.Deselect; OVERRIDE; (PROCEDURE TLayPickSelection.Highlight(highTransit: THighTransit); OVERRIDE; (PROCEDURE TLayPickSelection.KeyClear; OVERRIDE; (PROCEDURE TLayPickSelection.MouseMove(mouseLPt: LPoint); OVERRIDE; (PROCEDURE TLayPickSelection.MouseRelease; OVERRIDE; (PROCEDURE TLayPickSelection.Restore; OVERRIDE; (END; $TLayMoveCmd = SUBCLASS OF TCommand &{Variables} (layoutBox: TLayoutBox; (hOffset: LONGINT; (vOffset: LONGINT; &{Creation} (FUNCTION TLayMoveCmd.CREATE(object: TObject; heap: THeap; itsLayoutBox: TLayoutBox; DitsHOffset, itsVOffset: LONGINT): TLayMoveCmd; &{Command Execution} (PROCEDURE TLayMoveCmd.Perform(cmdPhase: TCmdPhase); OVERRIDE; (END; $TEditLegendSelection = SUBCLASS OF TSelection &{Variables} 'legendLayoutBox: TLegendLayoutBox; 'hostLegend: TLegend; 'textDialogImage: TTextDialogImage; 'suppressHost: BOOLEAN; 'tripleClick: BOOLEAN; {+SW+} &{Creation/Destruction} 'FUNCTION TEditLegendSelection.CREATE(object: TObject; heap: THeap; itsLegendLayoutBox: GTLegendLayoutBox; itsAnchorLPt: LPoint): TEditLegendSelection; 'FUNCTION TEditLegendSelection.Clone(heap: THeap): TObject; OVERRIDE; 'PROCEDURE TEditLegendSelection.Deselect; OVERRIDE; 'PROCEDURE TEditLegendSelection.Free; OVERRIDE; &{Udders} 'FUNCTION TEditLegendSelection.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN) R: BOOLEAN; OVERRIDE; 'PROCEDURE TEditLegendSelection.KeyBack(fWord: BOOLEAN); OVERRIDE; 'PROCEDURE TEditLegendSelection.KeyChar(ch: CHAR); OVERRIDE; 'PROCEDURE TEditLegendSelection.KeyEnter(dh, dv: INTEGER); OVERRIDE; 'PROCEDURE TEditLegendSelection.KeyReturn; OVERRIDE; 'PROCEDURE TEditLegendSelection.MouseMove(mouseLPt: LPoint); OVERRIDE; {+SW+} 'PROCEDURE TEditLegendSelection.MousePress(mouseLPt: LPoint); OVERRIDE; {+SW+} 'PROCEDURE TEditLegendSelection.MouseRelease; OVERRIDE; {+SW+} 'FUNCTION TEditLegendSelection.NewCommand(cmdNumber: TCmdNumber): TCommand; OVERRIDE; 'PROCEDURE TEditLegendSelection.PerformCommand(command: TCommand; cmdPhase: TCmdPhase); OVERRIDE; 'PROCEDURE TEditLegendSelection.Restore; OVERRIDE; 'PROCEDURE TEditLegendSelection.Reveal(asMuchAsPossible: BOOLEAN); OVERRIDE; 'END; $TDialogDesignWindow = SUBCLASS OF TDialogWindow (hostWindow: TWindow; (hostDialogView: TDialogView; (fromDialogBox: BOOLEAN; %FUNCTION TDialogDesignWindow.CREATE(object: TObject; heap: THeap; 4itsHostDialogView: TDialogView): TDialogDesignWindow; %FUNCTION TDialogDesignWindow.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN) O: BOOLEAN; OVERRIDE; %FUNCTION TDialogDesignWindow.NewCommand(cmdNumber: TCmdNumber): TCommand; OVERRIDE; %PROCEDURE TDialogDesignWindow.RelinquishControl; %PROCEDURE TDialogDesignWindow.Resize(moving: BOOLEAN); OVERRIDE; %PROCEDURE TDialogDesignWindow.SeizeControl; %END; { ------------------------------- classes implemented in file UDialog4 -------------------------------} TStdPrintManager = SUBCLASS OF TPrintManager $FUNCTION TStdPrintManager.CREATE(object: TObject; heap: THeap): TStdPrintManager; $PROCEDURE TStdPrintManager.EnterPageEditting; OVERRIDE; $PROCEDURE TStdPrintManager.Init(itsMainView: TView; itsDfltMargins: LRect); OVERRIDE; $PROCEDURE TStdPrintManager.ReactToPrinterChange; OVERRIDE; $PROCEDURE TStdPrintManager.SetDfltHeadings; OVERRIDE; $END; TLegendHeading = SUBCLASS OF THeading $masterLegend: TLegend; $currentLegend: TLegend; $topToBaseline: INTEGER; {offset from box top to baseline} $borders: Rect; {size by which box exceeds legend's extent} "{Creation/Destruction} $FUNCTION TLegendHeading.CREATE(object: TObject; heap: THeap; itsPrintManager: TPrintManager; (itsString: S255; itsTypeStyle: TTypeStyle; (itsPageAlignment: TPageAlignment; itsOffsetFromAlignment: LPoint; (itsBorders: Rect): TLegendHeading; $PROCEDURE TLegendHeading.Free; OVERRIDE; "{Nyingine} $PROCEDURE TLegendHeading.AdjustForPage(pageNumber: LONGINT; editing: BOOLEAN); OVERRIDE; $PROCEDURE TLegendHeading.Draw; OVERRIDE; $FUNCTION TLegendHeading.LaunchLayoutBox(view: TView): TImage; OVERRIDE; $PROCEDURE TLegendHeading.OffsetBy(deltaLPt: LPoint); OVERRIDE; $PROCEDURE TLegendHeading.RecalcExtent; OVERRIDE; $FUNCTION TLegendHeading.ShouldFrame: BOOLEAN; OVERRIDE; $END; TPageDesignWindow = SUBCLASS OF TDialogWindow $hostView: TView; {the view whose pages are being designed in this dialog} $layoutPanel: TPanel; {my controlPanel is the status panel} $FUNCTION TPageDesignWindow.CREATE(object: TObject; heap: THeap; itsHostView: TView): TPageDesignWindow; $PROCEDURE TPageDesignWindow.Disappear; OVERRIDE; $FUNCTION TPageDesignWindow.NewCommand(cmdNumber: TCmdNumber): TCommand; OVERRIDE; $END; TPagePlannerView = SUBCLASS OF TPlannerView $FUNCTION TPagePlannerView.CREATE(object: TObject; heap: THeap; itsPrintManager: TPrintManager; 4itsPanel: TPanel): TPagePlannerView; $PROCEDURE TPagePlannerView.Draw; OVERRIDE; $END; TPageStatusDialog = SUBCLASS OF TDialog $currentHeading: THeading; $oddEvenCluster: TCluster; $minPageFrame: TInputFrame; $maxPageFrame: TInputFrame; $alignCluster: TCluster; $unitsCluster: TCluster; $marginTitle: TLegend; $leftCluster: TCluster; $topCluster: TCluster; $rightCluster: TCluster; $bottomCluster: TCluster; "{Creation/Destruction} $FUNCTION TPageStatusDialog.CREATE(object: TObject; heap: THeap; itsPanel: TPanel): TPageStatusDialog; "{Sonst} $PROCEDURE TPageStatusDialog.ButtonPushed(button: TButton); OVERRIDE; $PROCEDURE TPageStatusDialog.CheckboxHit(checkbox: TCheckbox; toggleDirection: BOOLEAN); OVERRIDE; $FUNCTION TPageStatusDialog.DownAt(mouseLPt: LPoint): TDialogImage; OVERRIDE; $PROCEDURE TPageStatusDialog.Draw; OVERRIDE; $PROCEDURE TPageStatusDialog.InspectHeadingParms(VAR oddOnly, evenOnly: BOOLEAN; DVAR pageAlignment: TPageAlignment; VAR minPage, maxPage: LONGINT); $PROCEDURE TPageStatusDialog.SetHeadingParms(oddOnly, evenOnly: BOOLEAN; DpageAlignment: TPageAlignment; minPage, maxPage: LONGINT); $END; TPageLayoutBox = SUBCLASS OF TLayoutBox "{Creation/Destruction} $FUNCTION TPageLayoutBox.CREATE(object: TObject; heap: THeap; itsView: TView; itsHeading: THeading; 4itsResizable: BOOLEAN): TPageLayoutBox; $PROCEDURE TPageLayoutBox.FreeManipulee; OVERRIDE; $PROCEDURE TPageLayoutBox.TabGrabbed; OVERRIDE; $END; TLgHdngLayoutBox = SUBCLASS OF TPageLayoutBox $legendLayoutBox: TLegendLayoutBox; $FUNCTION TLgHdngLayoutBox.CREATE(object: TObject; heap: THeap; itsView: TView; (itsLegendHeading: TLegendHeading): TLgHdngLayoutBox; $FUNCTION TLgHdngLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TLgHdngLayoutBox.Draw; OVERRIDE; $PROCEDURE TLgHdngLayoutBox.MousePress(mouseLPT: LPoint); OVERRIDE; $PROCEDURE TLgHdngLayoutBox.Move(deltaLPt: LPoint); OVERRIDE; $PROCEDURE TLgHdngLayoutBox.RecalcExtent; OVERRIDE; $END; VAR $stdFrameBorders: Rect; {extra space around an input-frame and its text} $stdHdngBorders: Rect; {extra space around a standard heading} $stdHdngTypeStyle: TTypeStyle; {tile 12 monospaced, normal faces, for titles} $stdIDBorders: Rect; {a title tab with string, and a small border on the other 3 sides} $stdInputTypeStyle: TTypeStyle; {std input font/faces} $stdFrmeOffset: Point; {std distance between input frame's prompt and input rect} $stdLabelOffset: Point; {offset from top-left corner of a checkbox to leftmost pt of Mbaseline of label} $stdPlainBorders: Rect; {a slim captionless title tab, and a small border on the other M3 sides} $stdThinBorders: Rect; {a slim captionless title tab above; no other borders} $titleTypeStyle: TTypeStyle; {tile 15 monospaced, for titles of layout boxes} ${NB: All the above are initialized in the creation block of TDialogWindow} $stdButtonMetrics: TButtonMetrics; {reinitialized in TDialog.CREATE each time} {Unit-Global Procedures} FUNCTION NewStdDialogWindow(heap: THeap; itsHeight: INTEGER; itsKeyResponse, itsMenuResponse, 0itsDownInMainWindowResponse: TDiResponse): TDialogWindow; ,{sets up a standard, nonresizable, dialogWindow, and installs a single Panel into it, into -which it installs a single DialogView} FUNCTION NewStdLegend(heap: THeap; itsChars: S255; itsXLoc, itsYLoc: LONGINT; itsView: TView; 7itsTypeStyle: TTypeStyle): TLegend; FUNCTION NewSysLegend(heap: THeap; itsChars: S255; itsXLoc, itsYLoc: LONGINT; itsView: TView): TLegend; PROCEDURE SetParaExtent(paragraph: TParagraph; view: TView; location: LPoint; VAR extentLRect: LRect); PROCEDURE LRectAddBorders(baseLRect: LRect; borders: Rect; VAR resultLRect: LRect); PROCEDURE GetTextAndLocation(phraseNumber: INTEGER; VAR itsChars: S255; VAR itsLocation: LPoint); IMPLEMENTATION {$I LIBTK/UDialog2} {dialogs} {$I LIBTK/UDialog3} {layout} {$I LIBTK/UDialog4} {page margins} (********** {$I UDialog2} {dialogs} {$I UDialog3} {layout} {$I UDialog4} {page margins} **********) END. {unit UDialog} 3. "6F^9LFD!$ǐ^FLLayoutBox(view); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.OffsetBy(deltaLPt: LPoint); BEGIN ${$IFC fTrace}BP(11);{$ENDC} {$H-} LPtPlusLPt(SELF.location, deltaLPt, SELF.location); {$H+} $SUPERSELF.OffsetBy(deltaLPt); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.RecalcExtent; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.GetBoxRight; $IF SELF.parent <> NIL THEN (SELF.parent.RecalcExtent; (* Copyright 1984 by Apple Computer, Inc UDialog2 TDialogWindow -- TDialogView -- TDialogImage -- TImageWithID -- TDialog -- TButton -- TCheckbox -- TCluster -- TInputFrame -- TLegend *) {04/23/84 1210 SetParaExtent uses thePad rather than view's screenPad if amPrinting} {04/23/84 1210 Removed all references to 'underEdit' field of TDialogImage} {04/15/84 2345 Spring Release latest} {04/04/84 2300 Spring Prelim Release} {01/29/84 1750 RELEASE TK8D} {12/22/83 1927 RELEASE TK8A} {$IFC fRngABC} {$R+} {$ELSEC} {$R-} {$ENDC} {$IFC fSymABC} {$D+} {$ELSEC} {$D-} {$ENDC} VAR copyRight: STRING[45]; {----------------------------------------------------------------------------------------------------------} {$S DlgAlloc} PROCEDURE GetTextAndLocation(phraseNumber: INTEGER; VAR itsChars: S255; VAR itsLocation: LPoint); $VAR rawPhrase: S255; (restOfIt: S255; (morsel: S255; (semiColon: INTEGER; (comma: INTEGER; (aLocation: LPoint; (FUNCTION OKIntegerValue(Str: S255; VAR itsValue: LONGINT): BOOLEAN; 0VAR result: TConvResult; ,BEGIN ,StrToLInt(@str, itsValue, result); ,OkIntegerValue := (result = cvValid); ,END; $BEGIN {someone please optimize this someday} ${$IFC fTrace}BP(11);{$ENDC} $process.GetAlert(phraseNumber, rawPhrase); $semiColon := POS('@',rawPhrase); $IF semiColon = 0 THEN (semiColon := LENGTH(rawPhrase) + 1; $itsChars := COPY(rawPhrase, 1, semiColon - 1); $restOfIt := COPY(rawPhrase, semiColon + 1, LENGTH(rawPhrase) - semiColon); $comma := POS( ',', restOfIt); $morsel := COPY(restOfIt, 1, comma - 1); $IF OKIntegerValue(morsel, aLocation.h) THEN (BEGIN (morsel := COPY(restOfIt, comma + 1, LENGTH(restOfIt) - comma); (IF NOT OKIntegerValue(morsel, aLocation.v) THEN ,aLocation.v := 100; (END $ELSE (SetLPt(aLocation, 100, 100); $itsLocation := aLocation; ${$IFC fTrace}EP;{$ENDC} $END; {$S TK2Start} PROCEDURE LRectAddBorders(baseLRect: LRect; borders: Rect; VAR resultLRect: LRect); $BEGIN ${$IFC fTrace}BP(11);{$ENDC} $resultLRect.left := baseLRect.left + borders.left; $resultLRect.top := baseLRect.top + borders.top; $resultLRect.right := baseLRect.right + borders.right; $resultLRect.bottom := baseLRect.bottom + borders.bottom; ${$IFC fTrace}EP;{$ENDC} $END; {$S TK2Start} {"temporary" implementation, slow, unwieldy} PROCEDURE SetParaExtent(paragraph: TParagraph; view: TView; location: LPoint; VAR extentLRect: LRect); $VAR extent: Rect; (lExtent: LRect; (pad: TPad; {+SW+} $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (paragraph.BuildExtentLRect(zeroLPt, lExtent); {assumes grafPort device is SCREEN for textWidth} (noPad.LRectToRect(lExtent, extent); (* view.screenPad.RectToLRect(extent, extentLRect); *) (IF amPrinting THEN ,pad := thePad (ELSE ,pad := view.screenPad; (pad.RectToLRect(extent, extentLRect); {+SW+} (OffsetLRect(extentLRect, location.h, location.v); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} FUNCTION NewStdDialogWindow(heap: THeap; itsHeight: INTEGER; itsKeyResponse, 0itsMenuResponse, itsDownInMainWindowResponse: TDiResponse): TDialogWindow; $VAR dialogWindow: TDialogWindow; (panel: TPanel; (dialogView: TDialogView; (extentLRect: LRect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (dialogWindow := TDialogWindow.CREATE(NIL, heap, FALSE {not resizable}, itsHeight, 0itsKeyResponse, itsMenuResponse, itsDownInMainWindowResponse); (panel := TPanel.CREATE(NIL, heap, dialogWindow, 0, screenBits.bounds.right, [], []); (dialogWindow.controlPanel := panel; (SetLRect(extentLRect, 0, 0, screenBits.bounds.right, screenBits.bounds.bottom - 40); (dialogView := TDialogView.CREATE(NIL, heap, extentLRect, panel, NIL, screenRes); (dialogWindow.dialogView := dialogView; (NewStdDialogWindow := dialogWindow; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} $FUNCTION NewSysLegend(heap: THeap; itsChars: S255; itsXLoc, itsYLoc: LONGINT; itsView: TView): TLegend; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (NewSysLegend := NewStdLegend(heap, itsChars, itsXLoc, itsYLoc, itsView, sysTypeStyle); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} $FUNCTION NewStdLegend(heap: THeap; itsChars: S255; itsXLoc, itsYLoc: LONGINT; itsView: TView; 0itsTypeStyle: TTypeStyle): TLegend; (VAR itsString: S255; ,itsLocation: LPoint; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SetLPt(itsLocation, itsXLoc, itsYLoc); {=} (NewStdLegend := TLegend.CREATE(NIL, heap, itsChars, itsView, itsLocation, itsTypeStyle); ({$IFC fTrace}EP;{$ENDC} $END; METHODS OF TDialogWindow; {$S DlgAlloc} FUNCTION TDialogWindow.CREATE(object: TObject; heap: THeap; itsResizability: BOOLEAN; itsHeight: INTEGER; *itsKeyResponse, itsMenuResponse, itsDownInMainWindowResponse: TDiResponse): TDialogWindow; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TDialogWindow(TDialogBox.CREATE(object, heap, itsResizability, itsHeight, itsKeyResponse, PitsMenuResponse, itsDownInMainWindowResponse)); (SELF.controlPanel := SELF.selectPanel; {If not holding a TDialogView, client must reset} (SELF.dialogView := NIL; (SELF.mainDialog := NIL; ({$IFC fTrace}EP;{$ENDC} $END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TDialogWindow.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('controlPanel: TPanel'); $Field('dialogView: TDialogView'); $Field('mainDialog: TDialog'); $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TDialogWindow.Appear; $PROCEDURE TellYourView(obj: TObject); (PROCEDURE YouPrepare(obj: TObject); ,BEGIN ,TDialogImage(obj).PrepareToAppear; ,END; $BEGIN $IF InClass(TPanel(obj).view, TDialogView) THEN (TDialogView(TPanel(obj).view).EachActualPart(YouPrepare); $END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SUPERSELF.Appear; $SELF.panels.Each(TellYourView); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogWindow.BeDismissed; $VAR dialogView: TDialogView; (defaultButton: TButton; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $PushFocus; $SELF.Focus; $IF InClass(SELF.controlPanel.view, TDialogView) THEN (BEGIN (dialogView := TDialogView(SELF.controlPanel.view); (defaultButton := dialogView.defaultButton; (IF defaultButton <> NIL THEN ,dialogView.PushButton(defaultButton) ,{may want to put in a delay loop here to assure hilit button seen} (ELSE {dialog box has no default button; just take it down} ,currentWindow.TakeDownDialogBox; (END $ELSE {not a dialogView up there--must be a layout view} (currentWindow.TakeDownDialogBox; $PopFocus; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogWindow.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $CASE cmdNumber OF (uEditDialog: ,CanDoCommand := TRUE; (OTHERWISE ,CanDoCommand := currentWindow.CanDoCommand(cmdNumber, checkIt); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogWindow.Disappear; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SUPERSELF.Disappear; $IF SELF.controlPanel <> NIL THEN (IF InClass(SELF.controlPanel.view, TDialogView) THEN ,TDialogView(SELF.controlPanel.view).isShowing := FALSE; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogWindow.NewCommand(cmdNumber: TCmdNumber): TCommand; BEGIN ${$IFC fTrace}BP(12);{$ENDC} $CASE cmdNumber OF (uEditDialog: ,BEGIN ,IF SELF.controlPanel = NIL THEN {$IFC fDbgOK} 0ABCBreak('DialogWindow.NewCommand NIL ctl pnl', 0) {$ENDC} ,ELSE ,IF NOT InClass(SELF.controlPanel.view, TDialogView) THEN {$IFC fDbgOK} 0ABCBreak('DialogWindow.NewCommand, not a dialog view', 0) {$ENDC} ,ELSE 0TDialogDesignWindow.CREATE(NIL, SELF.Heap, TDialogView(SELF.controlPanel.view)).SeizeControl; ,NewCommand := NIL; ,END; (OTHERWISE ,NewCommand := currentWindow.NewCommand(cmdNumber); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} BEGIN $SetRect(stdPlainBorders, - stdLeftRightMargin, -stdSlimTitleHeight - stdBottomBorder, stdLeftRightMargin, 0stdBottomBorder); $SetRect(stdIDBorders , - stdLeftRightMargin, -stdTitleHeight - stdBottomBorder, stdLeftRightMargin, 0stdBottomBorder); $SetRect(stdThinBorders , 0, -stdSlimTitleHeight, 0, 0); $SetPt(stdLabelOffset, 8, -2); $SetPt(stdFrmeOffset, 20, 0); $SetRect(stdFrameBorders, -30, -16, 30, 16); $SetRect(stdHdngBorders, -6, -12, 6, 4); $MakeTypeStyle(famModern, size12Pitch, [], stdInputTypeStyle); $MakeTypeStyle(famModern, size15Pitch, [], titleTypeStyle); $MakeTypeStyle(famModern, size12Pitch, [], stdHdngTypeStyle); $copyright := 'Copyright 1983, 1984 by Apple Computer, Inc.'; END; METHODS OF TDialogView; {$S DlgAlloc} FUNCTION TDialogView.CREATE{(object: TObject; heap: THeap; itsExtentLRect: LRect; itsPanel: TPanel; 4itsPrintManager: TPrintManager; itsRes: Point)}; $VAR rootDialog: TDialog; (dialogWindow: TDialogWindow; (styleSheet: TStyleSheet; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TDialogView(TView.CREATE(object, heap, itsPanel, itsExtentLRect, itsPrintManager, stdMargins, 9(itsPrintManager <> NIL), itsRes, TRUE)); $SELF.nonDialogExtent := itsExtentLRect; $rootDialog := TDialog.CREATE(NIL, heap, 'ROOT', SELF); $SELF.rootDialog := rootDialog; {create an empty master} $styleSheet := TStyleSheet.CREATE(NIL, heap); $SELF.styleSheet := styleSheet; $WITH SELF DO (BEGIN (isShowing := FALSE; {not yet actually put up} (currentDialogImage := NIL; (defaultButton := NIL; (hitButton := NIL; (paintFreeBoxes := FALSE; {client can set this to TRUE after the CREATE call} (paintSense := FALSE; (startedPainting := FALSE; (mouseIsDown := FALSE; (magnetCursor := noCursor; (END; $IF InClass(itsPanel.window, TDialogWindow) THEN (BEGIN (dialogWindow := TDialogWindow(itsPanel.window); (IF dialogWindow.controlPanel = NIL THEN ,dialogWindow.controlPanel := itsPanel; (IF dialogWindow.dialogView = NIL THEN ,dialogWindow.dialogView := SELF; (END; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TDialogView.Free; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $Free(SELF.rootDialog); $Free(SELF.styleSheet); $SUPERSELF.Free; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TDialogView.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('rootDialog: TDialog'); $Field('nonDialogExtent: LRect'); $Field('currentDialogImage: TDialogImage'); $Field('defaultButton: TButton'); $Field('hitButton: TButton'); $Field('isShowing: BOOLEAN'); $Field('paintFreeBoxes: BOOLEAN'); $Field('paintSense: BOOLEAN'); $Field('startedPainting: BOOLEAN'); $Field('styleSheet: TStyleSheet'); $Field('mouseIsDown: BOOLEAN'); $Field('magnetCursor: INTEGER'); $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TDialogView.AbandonThatButton; $PROCEDURE TurnOutTheLights; (BEGIN (SELF.hitButton.Highlight(hOnToOff); (END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.hitButton <> NIL THEN (BEGIN (SELF.panel.OnAllPadsDo(TurnOutTheLights); (IF SELF.currentDialogImage = SELF.hitButton THEN ,SELF.currentDialogImage := NIL; (SELF.hitButton := NIL; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogView.AddDialog(dialog: TDialog); $VAR dialogWindow: TDialogWindow; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.rootDialog.AddImage(dialog); $IF InClass(SELF.panel.window, TDialogWindow) THEN (BEGIN (dialogWindow := TDialogWindow(SELF.panel.window); (IF dialogWindow.mainDialog = NIL THEN ,dialogWindow.mainDialog := dialog; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialogView.AddNewDialog(itsKey: S4): TDialog; $VAR dialogWindow: TDialogWindow; (dialog: TDialog; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $dialog := TDialog.CREATE(NIL, SELF.Heap, itsKey, SELF); $SELF.AddDialog(dialog); $AddNewDialog := dialog; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogView.ActivateDialog(dialog: TDialog; whichWay: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.rootDialog.ActivateImage(dialog, whichWay); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.ButtonPushed(button: TButton); $CONST delayTime = 50000; VAR dialogView: TDialogView; $command: TCommand; $sink: LONGINT; $i: LONGINT; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF currentWindow.dialogBox <> NIL THEN (BEGIN (dialogView := TDialogView(TDialogWindow(currentWindow.dialogBox).controlPanel.view); (command := NIL; (IF dialogView = SELF THEN ,BEGIN ,sink := 124395; ,FOR i := 1 TO delayTime DO 0sink := sink - sink; ,dialogView.AbandonThatButton; {turn off highlighting just in case the dialog will be reused} ,IF button.cmdNumber <> noCmdNumber THEN 0command := currentWindow.selectPanel.selection.NewCommand(button.cmdNumber); ,currentWindow.TakeDownDialogBox; ,IF command <> NIL THEN 0currentWindow.PerformCommand(command); ,END; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.CheckboxHit(checkbox: TCheckbox; toggleDirection: BOOLEAN); {The client will occasionally want to override this, in order to change the display as an immediate consequence of a Checkbox being toggled} $BEGIN '{$IFC fTrace}BP(11);{$ENDC} '{ ... } '{$IFC fTrace}EP;{$ENDC} $END; {$S DlgHot} FUNCTION TDialogView.CursorAt(mouseLPt: LPoint): TCursorNumber; $VAR cursorNumber: TCursorNumber; BEGIN #{$IFC fTrace}BP(11);{$ENDC} $cursorNumber := noCursor; $IF SELF.mouseIsDown AND (SELF.magnetCursor <> noCursor) THEN (cursorNumber := SELF.magnetCursor $ELSE (BEGIN (IF LRectHasLPt(SELF.rootDialog.extentLRect, mouseLPt) THEN +cursorNumber := SELF.rootDialog.CursorAt(mouseLPt); (IF cursorNumber = noCursor THEN ,cursorNumber := SELF.XCursorAt(mouseLPt); (END; #CursorAt := cursorNumber; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.Draw; $VAR s: TListScanner; (dialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.isShowing := TRUE; {update event triggered this} $SELF.rootDialog.Draw; {draw dialogs} $SELF.XDraw; {draw other stuff} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.rootDialogImage.EachActualPart(doToObject); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.MouseMove(mouseLPt: LPoint); $VAR currentDialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $currentDialogImage := SELF.currentDialogImage; $IF currentDialogImage <> NIL THEN (IF NOT currentDialogImage.StillMyMouse(mouseLPt) THEN +currentDialogImage := NIL; $IF currentDialogImage = NIL THEN (BEGIN (currentDialogImage := SELF.rootDialog.DownAt(mouseLPt); (IF currentDialogImage = NIL THEN ,SELF.XMouseMove(mouseLPt); (END; $SELF.currentDialogImage := currentDialogImage; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.MousePress(mouseLPt: LPoint); $VAR panel: TPanel; (takenBySelection: BOOLEAN; (currentDialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $panel := SELF.panel; $SELF.startedPainting := FALSE; $takenBySelection := FALSE; $SELF.mouseIsDown := TRUE; $SELF.magnetCursor := noCursor; $currentDialogImage := SELF.currentDialogImage; $IF (currentDialogImage <> NIL) AND (SELF.panel.selection.kind <> nothingKind) THEN (IF currentDialogImage.Hit(mouseLPt) THEN ,BEGIN ,SELF.panel.selection.MousePress(mouseLPt); ,takenBySelection := TRUE; ,END; $IF NOT takenBySelection THEN (BEGIN (panel.BeginSelection; (currentDialogImage := SELF.rootDialog.DownAt(mouseLPt); (IF currentDialogImage = NIL THEN ,SELF.XMousePress(mouseLPt) (END; $SELF.currentDialogImage := currentDialogImage; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.MouseRelease; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.mouseIsDown := FALSE; $SELF.magnetCursor := noCursor; $IF SELF.currentDialogImage <> NIL THEN (SELF.currentDialogImage.MouseRelease $ELSE (SELF.XMouseRelease; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.PushButton(button: TButton); {client or ToolKit may call} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF InClass(button.parent, TDialog) THEN (TDialog(button.parent).PushButton(button); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogView.RecalcExtent; $VAR newExtent: LRect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF NOT EmptyLRect(SELF.rootDialog.extentLRect) THEN (BEGIN (IF NOT EmptyLRect(SELF.nonDialogExtent) THEN ,UnionLRect(SELF.rootDialog.extentLRect, SELF.nonDialogExtent, newExtent); (SELF.Resize(newExtent); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogView.RemoveDialog(dialog: TDialog; andFree: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.rootDialog.DeleteImage(dialog, andFree); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogView.ReplaceDialog(oldDialog, newDialog: TDialog); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.rootDialog.ReplaceImage(oldDialog, newDialog); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogView.SetDefaultButton(button: TButton); $VAR thickPnSize: point; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.defaultButton := button; $SetPt(thickPnSize, 3, 2); $IF button <> NIL THEN (button.buttonMetrics.penState.pnSize := thickPnSize; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogView.XCursorAt(mouseLPt: LPoint): TCursorNumber; BEGIN #{$IFC fTrace}BP(11);{$ENDC} #XCursorAt := arrowCursor; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.XDraw; BEGIN #{$IFC fTrace}BP(11);{$ENDC} #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.XMousePress(mouseLPt: LPoint); BEGIN #{$IFC fTrace}BP(11);{$ENDC} #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.XMouseMove(mouseLPt: LPoint); BEGIN #{$IFC fTrace}BP(11);{$ENDC} #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogView.XMouseRelease; BEGIN #{$IFC fTrace}BP(11);{$ENDC} #{$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; {----------------------------------------------------------------------------------------------------------} METHODS OF TDialogImage; {$S TK2Start} FUNCTION TDialogImage.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; 0itsView: TView; withChildren: BOOLEAN): TDialogImage; $VAR newList: TList; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TDialogImage(TImage.CREATE(object, heap, itsExtent, itsView)); $WITH SELF DO (BEGIN (parent := NIL; (isActive := TRUE; (isEditable := TRUE; (withID := FALSE; (END; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TDialogImage.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('parent: TDialogImage'); $Field('isActive: BOOLEAN'); $Field('isEditable: BOOLEAN'); $Field('withID: BOOLEAN'); $Field(''); END; {$ENDC} {$S DlgCold} PROCEDURE TDialogImage.AddImage(dialogImage: TDialogImage); BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogImage.ActivateImage(dialogImage: TDialogImage; whichWay: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF dialogImage.isActive <> whichWay THEN {state needs to change} (BEGIN (dialogImage.isActive := whichWay; (SELF.view.panel.InvalLRect(dialogImage.extentLRect); {??? Want to recalc my extent here???} (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TDialogImage.BringToFront(dialogImage: TDialogImage); BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TDialogImage.ComeForward; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.parent <> NIL THEN (SELF.parent.BringToFront(SELF); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogImage.ControlHit(control: TDialogImage; toggleDirection: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.parent <> NIL THEN (SELF.parent.ControlHit(control, toggleDirection); #{$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialogImage.DeleteImage(dialogImage: TDialogImage; andFree: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogImage.DownAt(mouseLPt: LPoint): TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN (BEGIN (SELF.MousePress(mouseLPt); (DownAt := SELF; (END $ELSE (DownAt := NIL; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogImage.Draw; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.DrawJustMe; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgDbg} {by design} PROCEDURE TDialogImage.DrawJustMe; BEGIN ${$IFC fTrace}BP(113);{$ENDC} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogImage.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${overrides TImage's version, does specifically Nothing; TImageWithID redefines} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogImage.HasId(id: S255): BOOLEAN; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $HasID := FALSE; ${$IFC fTrace}EP;{$ENDC} END; {$S SgLayout} FUNCTION TDialogImage.LaunchLayoutBox(view: TView): TImage; $VAR myLayoutBox: TLayoutBox; (plannerView: TPlannerView; BEGIN ${$IFC fTrace}BP(10);{$ENDC} $IF NOT SELF.isActive THEN (LaunchLayoutBox := NIL $ELSE (LaunchLayoutBox := TLayoutBox.CREATE(NIL, view.Heap, SELF.extentLRect, '', NIL, ,view, SELF, stdPlainBorders, FALSE, FALSE, FALSE); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogImage.ObjectWithIDNumber(idNumber: INTEGER): TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $ObjectWithIDNumber := NIL; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogImage.ObjWithId(id: S255): TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $ObjWithId := NIL; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogImage.PrepareToAppear; BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialogImage.RecalcExtent; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.parent <> NIL THEN (SELF.parent.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TDialogImage.ReplaceImage(replacee, newValue: TDialogImage); BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialogImage.StillMyMouse(mouseLPt: LPoint): BOOLEAN; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN (StillMyMouse := TRUE {I've handled it} $ELSE (StillMyMouse := FALSE; {give it to someone else} #{default; this will usually be overridden in subclass} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; METHODS OF TImageWithID; {$S DlgHot} FUNCTION TImageWithID.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; 0itsView: TView; withChildren: BOOLEAN): TImageWithID; $VAR newList: TList; (newID: TId; (cState: TConvResult; (newIDNumber: INTEGER; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TImageWithID(TDialogImage.CREATE(object, heap, itsExtent, itsID, itsView, withChildren)); $newID := Copy(itsId, 1, MIN(idLength, LENGTH(itsId))); $StrUpperCased(@newID); $StrToInt(@newID, newIDNumber, cState); $IF cState <> cvValid THEN (newIDNumber := noIDNumber; $WITH SELF DO (BEGIN (id := newID; (idNumber := newIDNumber; (withId := TRUE; (END; $IF withChildren THEN (BEGIN (newList := TList.CREATE(NIL, heap, 0); (SELF.children := newList; (END $ELSE (SELF.children := NIL; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgWarm} FUNCTION TImageWithID.Clone(heap: THeap): TObject; $VAR children: TList; (copyOfMyself: TImageWithID; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $copyOfMyself := TImageWithID(SUPERSELF.Clone(heap)); $IF SELF.children <> NIL THEN (BEGIN (children := TList(SELF.children.Clone(heap)); (copyOfMyself.children := children; (END; $Clone := copyOfMyself; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgWarm} PROCEDURE TImageWithID.Free; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $Free(SELF.children); $SUPERSELF.Free; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TImageWithID.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('children: TList'); $Field('id: STRING[9]'); $Field('idNumber: INTEGER'); $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TImageWithID.ActivateImage(dialogImage: TDialogImage; whichWay: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF dialogImage.isActive <> whichWay THEN {state needs to change} (BEGIN (dialogImage.isActive := whichWay; (SELF.view.panel.InvalLRect(dialogImage.extentLRect); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.AddImage(dialogImage: TDialogImage); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.children.InsLast(dialogImage); $dialogImage.parent := SELF; $dialogImage.HaveView(SELF.view); $IF EmptyLRect(SELF.extentLRect) THEN (SELF.extentLRect := dialogImage.extentLRect $ELSE {$H-} UnionLRect(SELF.extentLRect, dialogImage.extentLRect, SELF.extentLRect); {$H+} $IF SELF.parent <> NIL THEN (SELF.parent.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.BringToFront(dialogImage: TDialogImage); $VAR s: TListScanner; (image: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.children <> NIL THEN (BEGIN (s := SELF.children.Scanner; (WHILE s.Scan(image) DO ,IF image = dialogImage THEN 0BEGIN 0s.Delete(FALSE); 0s.Done; 0SELF.children.insLast(dialogImage); 0END; (END; $IF SELF.parent <> NIL THEN (SELF.parent.BringToFront(SELF); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TImageWithID.CursorAt(mouseLPt: LPoint): TCursorNumber; $VAR s: TListScanner; (dialogImage: TDialogImage; (cursorNumber: TCursorNumber; {default: just passes the request on to children until one sets it} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $cursorNumber := noCursor; $IF LRectHasLPt(SELF.extentLRect, mouseLPt) THEN (IF SELF.children <> NIL THEN ,BEGIN ,s := SELF.children.Scanner; ,WHILE s.Scan(dialogImage) DO 0IF dialogImage.isActive THEN 4BEGIN 4cursorNumber := dialogImage.CursorAt(mouseLPt); 4IF cursorNumber <> noCursor THEN 8s.Done; 4END; ,END; $CursorAt := cursorNumber; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TImageWithID.DeleteImage(dialogImage: TDialogImage; andFree: BOOLEAN); {deletes the indicated dialogImage from my children} $VAR s: TListScanner; (aDialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $s:= SELF.children.Scanner; $WHILE s.Scan(aDialogImage) DO (IF aDialogImage = dialogImage THEN ,BEGIN ,IF (TDialogView(SELF.view).isShowing) AND (dialogImage.isActive) THEN 0SELF.view.panel.InvalLRect(dialogImage.extentLRect); ,s.Delete(andFree); ,s.Done; ,END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.Draw; $PROCEDURE YouDraw(obj: TObject); (VAR dialogImage: TDialogImage; $BEGIN (dialogImage := TDialogImage(obj); (IF dialogImage.isActive THEN ,dialogImage.Draw; $END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF LRectIsVisible(SELF.extentLRect) THEN (BEGIN (SELF.EachActualPart(YouDraw); (SELF.DrawJustMe; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.children <> NIL THEN (SELF.children.Each(DoToObject); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.EachVirtualPart(PROCEDURE DoToObject(filteredObj: TObject)); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.EachActualPart(DoToObject); {???} #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TImageWithID.HasId(id: S255): BOOLEAN; BEGIN ${$IFC fTrace}BP(11);{$ENDC} {$H-} id := Copy(id, 1, MIN(idLength, LENGTH(id))); {$H+} $StrUpperCased(@id); $IF SELF.id = id THEN (HasId := TRUE $ELSE (HasId := FALSE; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.HaveView(view: TView); $PROCEDURE YouHaveView(obj: TObject); (VAR dialogImage: TDialogImage; $BEGIN (dialogImage := TDialogImage(obj); (dialogImage.HaveView(view); $END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.view := view; $SELF.EachActualPart(YouHaveView); ${$IFC fTrace}EP;{$ENDC} END; {$S SgLayout} FUNCTION TImageWithID.LaunchLayoutBox(view: TView): TImage; $VAR dialogImage: TDialogImage; (newExtent: LRect; (boxTitle: S255; (theString: TLegend; (childsLayoutBox: TLayoutBox; (myLayoutBox: TLayoutBox; (plannerView: TPlannerView; (postChildExtent: LRect; (withChildren: BOOLEAN; $PROCEDURE YouMakeLayoutBoxes(obj: TObject); ,VAR dialogImage: TDialogImage; 0interimImage: TImage; (BEGIN (dialogImage := TDialogImage(obj); (interimImage := dialogImage.LaunchLayoutBox(view); (IF interimImage <> NIL THEN ,BEGIN ,childsLayoutBox := TLayoutBox(interimImage); ,myLayoutBox.AddImage(childsLayoutBox); ,UnionLRect(postChildExtent, childsLayoutBox.extentLRect, postChildExtent); ,END; (END; BEGIN ${$IFC fTrace}BP(10);{$ENDC} $IF NOT SELF.isActive THEN 'LaunchLayoutBox := NIL $ELSE (BEGIN {=} (plannerView := TPlannerView(view); (IF SELF.ID <> '' THEN ,boxTitle := SELF.id (ELSE (IF SELF.idNumber = noIDNumber THEN ,boxTitle := '' (ELSE ,IntToString(SELF.idNumber, @boxTitle); (withChildren := (SELF.children <> NIL); (IF withChildren THEN ,withChildren := SELF.children.Size > 0; (myLayoutBox := TLayoutBox.CREATE(NIL, SELF.Heap, SELF.extentLRect, boxTitle, NIL, plannerView, SELF, 8stdIDBorders, FALSE, withChildren, withChildren); 3{default for a dialogImage is for the layout box to SUPPRESS drawing the manipulee} (postChildExtent := SELF.extentLRect; {i.e., WITHOUT my borders} (SELF.EachActualPart(YouMakeLayoutBoxes); {tells my children to make their own layout Rboxes; may grow postChildExtent} (myLayoutBox.RecalcExtent; (LaunchLayoutBox := myLayoutBox; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TImageWithID.ObjectWithIDNumber(idNumber: INTEGER): TDialogImage; $VAR s: TListScanner; (dialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $ObjectWithIDNumber := NIL; $IF SELF.children <> NIL THEN (BEGIN (s := SELF.children.Scanner; (WHILE s.Scan(dialogImage) DO ,IF dialogImage.withID THEN 0IF TImageWithID(dialogImage).idNumber = idNumber THEN 4BEGIN 4ObjectWithIDNumber := dialogImage; 4s.Done; 4END; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TImageWithID.ObjWithId(id: S255): TDialogImage; $VAR s: TListScanner; (dialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $id := Copy(id, 1, MIN(idLength, LENGTH(id))); $StrUpperCased(@id); $ObjWithId := NIL; $IF SELF.children <> NIL THEN (BEGIN (s := SELF.children.Scanner; (WHILE s.Scan(dialogImage) DO ,IF dialogImage.withID THEN 0IF TImageWithID(dialogImage).id = id THEN 4BEGIN 4ObjWithId := dialogImage; 4s.Done; 4END; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TImageWithID.OffSetBy(deltaLPt: LPoint); $PROCEDURE YouOffset(obj: TObject); $BEGIN (TDialogImage(obj).OffsetBy(deltaLPt); $END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} {$H-} OffsetLRect(SELF.extentLRect, deltaLPt.h, deltaLPt.v); {$H+} $SELF.EachActualPart(YouOffset); {tells children} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgWarm} PROCEDURE TImageWithID.RecalcExtent; {a bottom-up communication line; child who changes tells Ihis parent, who changes himself and then tells HIS parent} $VAR s: TListScanner; (dialogImage: TDialogImage; (newExtent: LRect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} ${can be speeded up} $IF SELF.children <> NIL THEN (IF SELF.children.Size > 0 THEN ,BEGIN ,newExtent := zeroLRect; ,s := SELF.children.Scanner; ,WHILE s.Scan(dialogImage) DO 0IF EmptyLRect(newExtent) THEN 4newExtent := dialogImage.extentLRect 0ELSE 4UnionLRect(newExtent, dialogImage.extentLRect, newExtent); ,SELF.Resize(newExtent); ,END; $IF SELF.parent <> NIL THEN (SELF.parent.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TImageWithID.ReplaceImage(replacee, newValue: TDialogImage); {make this such that it puts back at same place; or use Become} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.DeleteImage(replacee, TRUE); $SELF.AddImage(newValue); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TImageWithID.StillMyMouse(mouseLPt : LPoint): BOOLEAN; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN (StillMyMouse := TRUE {I've handled it} $ELSE (StillMyMouse := FALSE; {give it to someone else} #{default; this will usually be overridden in subclass} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; METHODS OF TDialog; {$S DlgAlloc} FUNCTION TDialog.CREATE(object: TObject; heap: THeap; itsKey: S4; itsView: TView): TDialog; $VAR itsStringKey: TStringKey; (itsExtent: LRect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $WITH stdButtonMetrics DO (BEGIN (height := stdBtnHeight; (curvH := stdCurvH; (curvV := stdCurvV; (typeStyle := sysTypeStyle; (penState := normalPen; (expandNum := 4; (expandDen := 3; (absMinWidth := 80; (END; $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TDialog(TImageWithID.CREATE(object, heap, zeroLRect, itsKey, itsView, TRUE)); $XferLeft(Ptr(ORD(@itsKey)+1), @itsStringKey.trueKey, 4); {get it into LONGINT form} $itsStringKey.key := itsKey; $SELF.stringKey := itsStringKey; #{$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TDialog.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('stringKey: RECORD trueKey: LONGINT; key: STRING[4] END'); $Field(''); END; {$ENDC} {$S DlgAlloc} FUNCTION TDialog.NewButton(itsPhrase: INTEGER; itsMetrics: TButtonMetrics; sameSizedButton: TButton; 4itsCmdNumber: TCmdNumber): TButton; $VAR itsID: S255; (itsLocation: LPoint; (button: TButton; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $button := SELF.AddButton(itsID, itsLocation, itsMetrics, sameSizedButton, itsCmdNumber); $button.idNumber := itsPhrase; $NewButton := button; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.NewCluster(itsPhrase: INTEGER): TCluster; $VAR itsID: S255; (itsLocation: LPoint; (cluster: TCluster; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $cluster := SELF.AddStdCluster(itsID, itsLocation.h, itsLocation.v); $cluster.idNumber := itsPhrase; $NewCluster := cluster; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.NewFreeCheckbox(itsPhrase: INTEGER; boxWidth: INTEGER; $boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle): TCheckBox; $VAR itsID: S255; (itsLocation: LPoint; (checkbox: TCheckbox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $checkbox := SELF.AddFreeCheckbox(itsID, itsLocation.h, itsLocation.v, boxWidth, boxHeight, (wantLabel, labelOffset, itsTypeStyle); $checkbox.idNumber := itsPhrase; $NewFreeCheckbox := checkbox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.NewInputFrame(itsPhrase: INTEGER; promptTypeStyle: TTypeStyle; (inputOffset: Point; inputTypeStyle: TTypeStyle; (maxInputChars: INTEGER; itsBorders: Rect; drawInputLRect: BOOLEAN; (drawHitLRect: BOOLEAN): TInputFrame; $VAR itsID: S255; (itsLocation: LPoint; (inputFrame: TInputFrame; (inputLocation: LPoint; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $SetQDTypeStyle(promptTypeStyle); $WITH inputLocation DO (BEGIN (h := itsLocation.h + StringWidth(itsID) + inputOffset.h; (v := itsLocation.v + inputOffset.v; (END; $inputFrame := SELF.AddInputFrame(itsID, itsLocation, promptTypeStyle, (inputLocation, inputTypeStyle, maxInputChars, itsBorders, drawInputLRect, (drawHitLRect); $inputFrame.idNumber := itsPhrase; $NewInputFrame := inputFrame; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.NewLegend(itsPhrase: INTEGER; itsTypeStyle: TTypeStyle): TLegend; $VAR itsID: S255; (itsLocation: LPoint; (legend: TLegend; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $legend := SELF.AddStdLegend(itsID, itsLocation.h, itsLocation.v, itsTypeStyle); $NewLegend := legend; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.NewRowOfBoxes(itsPhrase: INTEGER; numberOfBoxes: INTEGER; $startingIDNumber: INTEGER; boxWidth: INTEGER; boxHeight: INTEGER; boxSpacing: INTEGER): TCluster; $VAR itsID: S255; (itsLocation: LPoint; (cluster: TCluster; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $cluster := SELF.AddRowOfBoxes(itsID, itsLocation.h, itsLocation.v, numberOfBoxes, (startingIDNumber, boxWidth, boxHeight, boxSpacing); $cluster.idNumber := itsPhrase; $NewRowOfBoxes := cluster; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialog.AddOKButton(cmdNumber: TCmdNumber); $VAR button: TButton; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $button := SELF.NewButton(phOK, stdButtonMetrics, 0TButton(SELF.ObjectWithIDNumber(phCancel)), cmdNumber); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialog.AddCancelButton(cmdNumber: TCmdNumber); $VAR button: TButton; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $button := SELF.NewButton(phCancel, stdButtonMetrics, 0TButton(SELF.ObjectWithIDNumber(phOK)), cmdNumber); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddBigFreeCheckbox(itsId: S255; itsXLoc, itsYLoc: LONGINT): TCheckbox; {---} $VAR location: LPoint; (itsChars: S255; (newBox: TCheckbox; (labelOffset: Point; (typeStyle: TTypeStyle; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SetLPt(location, itsXLoc, itsYLoc); (SetPt(labelOffset, 20, -4); (MakeTypeStyle(famClassic, size18Point, [], typeStyle); (newBox := TCheckbox.CREATE(NIL, SELF.Heap, itsId, SELF.view, location, 36, 24, TRUE, ,labelOffset, typeStyle); (SELF.AddImage(newBox); (AddBigFreeCheckbox := newBox; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} FUNCTION TDialog.AddButton(itsId: S255; itsLocation: LPoint; itsMetrics: TButtonMetrics; (sameSizedButton: TButton; itsCmdNumber: TCmdNumber): TButton; $VAR button: TButton; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $button := TButton.CREATE(NIL, SELF.Heap, itsId, SELF.view, itsLocation, itsMetrics, (sameSizedButton, itsCmdNumber); $SELF.AddImage(button); $AddButton := button; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddStdButton(itsId: S255; itsXLoc, itsYLoc: LONGINT; sameSizedButton: TButton; 0itsCmdNumber: TCmdNumber): TButton; VAR location: LPoint; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SetLPt(location, itsXLoc, itsYLoc); $AddStdButton := SELF.AddButton(itsID, location, stdButtonMetrics, sameSizedButton, itsCmdNumber); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddStdFreeCheckbox(itsId: S255; itsXLoc, itsYLoc: LONGINT): TCheckBox; VAR legend: TLegend; $location: LPoint; $checkbox: TCheckbox; BEGIN #{$IFC fTrace}BP(11);{$ENDC} #SetLPt (location, itsXLoc, itsYLoc); #checkbox := TCheckbox.CREATE(NIL, SELF.Heap, itsId, SELF.view, location, stdBoxWidth, (stdBoxHeight, TRUE, stdLabelOffset, sysTypeStyle); #SELF.AddImage(checkbox); #AddStdFreeCheckbox := checkbox; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddStdCluster(itsId: S255; itsXLoc, itsYLoc: LONGINT): TCluster; $VAR location: LPoint; (cluster: TCluster; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SetLPt(location, itsXLoc, itsYLoc); (cluster :=TCluster.CREATE(NIL, SELF.Heap, itsId, SELF.view, location); (SELF.AddImage(cluster); (AddStdCluster := cluster; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} FUNCTION TDialog.AddFreeCheckbox(itsID: S255; itsXLoc, itsYLoc: LONGINT; boxWidth: INTEGER; (boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle): TCheckbox; $VAR location: LPoint; (checkbox: TCheckbox; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SetLPt(location, itsXLoc, itsYLoc); (checkbox := TCheckbox.CREATE(NIL, SELF.Heap, itsID, SELF.view, location, boxWidth, boxHeight, 8wantLabel, labelOffset, itsTypeStyle); (SELF.AddImage(checkbox); (AddFreeCheckbox := checkbox; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} FUNCTION TDialog.AddInputFrame(itsId: S255; (promptLocation: LPoint; promptTypeStyle: TTypeStyle; (inputLocation: LPoint; inputTypeStyle: TTypeStyle; (maxInputChars: INTEGER; itsBorders: Rect; drawInputLRect: BOOLEAN; (drawHitLRect: BOOLEAN): TInputFrame; $VAR inputFrame: TInputFrame; BEGIN #{$IFC fTrace}BP(11);{$ENDC} #inputFrame := TInputFrame.CREATE(NIL, SELF.Heap, itsID, SELF.view, promptLocation, promptTypeStyle, (inputLocation, inputTypeStyle, maxInputChars, itsBorders, (drawInputLRect, drawHitLRect); #SELF.AddImage(inputFrame); #AddInputFrame := inputFrame; #{$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddRowOfBoxes(itsID: S255; itsXLoc, itsYLoc: LONGINT; numberOfBoxes: INTEGER; $startingIDNumber: INTEGER; boxWidth: INTEGER; boxHeight: INTEGER; boxSpacing: INTEGER): TCluster; $VAR currentIDNumber: INTEGER; (checkbox: TCheckbox; (newLocation: LPoint; (newID: S255; (cluster: TCluster; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $cluster := SELF.AddStdCluster(itsID, itsXLoc, itsYLoc); $FOR currentIDNumber := startingIDNumber TO (startingIDNumber + numberOfBoxes - 1) DO (BEGIN (IF cluster.lastBox = NIL THEN {this is the first to be inserted} ,newLocation := cluster.location (ELSE { There is already at least one box in the cluster -- align to right of it} ,WITH newLocation DO 0BEGIN 0h := cluster.lastBox.rectImage.extentLRect.right + boxSpacing; {??} 0v := cluster.lastBox.rectImage.extentLRect.top; 0END; (IntToString(currentIDNumber, @newID); (checkbox := cluster.AddCheckbox(newID, newLocation, boxWidth, boxHeight, FALSE, zeroPt, ,sysTypeStyle, FALSE); (checkBox.IDNumber := currentIDNumber; (END; $AddRowOfBoxes := cluster; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddStdInputFrame(itsId: S255; itsXLoc: LONGINT; (itsYLoc: LONGINT; maxInputChars : INTEGER): TInputFrame; $VAR promptLocation: LPoint; (inputLocation: LPoint; (inputFrame: TInputFrame; BEGIN #{$IFC fTrace}BP(11);{$ENDC} $SetLPt(promptLocation, itsXLoc, itsYLoc); $SetQDTypeStyle(sysTypeStyle); $WITH inputLocation DO (BEGIN (h := itsXLoc + StringWidth(itsID) + 20; (v := itsYLoc; (END; $inputFrame := TInputFrame.CREATE(NIL, SELF.Heap, itsId, SELF.view, promptLocation, sysTypeStyle, (inputLocation, stdInputTypeStyle, maxInputChars, (stdFrameBorders, TRUE {draw input LRect}, TRUE {draw HitLRect}); $SELF.AddImage(inputFrame); $AddStdInputFrame := inputFrame; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddStdLegend(itsId: S255; itsXLoc, itsYLoc: LONGINT; (itsTypeStyle: TTypeStyle): TLegend; $VAR newString: TLegend; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $newString := NewStdLegend(SELF.Heap, itsID, itsXLoc, itsYLoc, SELF.view, itsTypeStyle); $SELF.AddImage(newString); $AddStdLegend := newString; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TDialog.AddSysLegend(itsId: S255; itsXLoc, itsYLoc: LONGINT): TLegend; $VAR newString: TLegend; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $newString := NewSysLegend(SELF.Heap, itsID, itsXLoc, itsYLoc, SELF.view); $SELF.AddImage(newString); $AddSysLegend := newString; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialog.ButtonPushed(button: TButton); {usually'll be called through SUPERSELF} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.parent <> NIL THEN (TDialog(SELF.parent).ButtonPushed(button) $ELSE (TDialogView(SELF.view).ButtonPushed(button); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialog.CheckboxHit(checkbox: TCheckbox; toggleDirection: BOOLEAN); ${default--passes up the line; client can reimplement} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.parent <> NIL THEN (BEGIN (IF InClass(SELF.parent, TDialog) THEN ,TDialog(SELF.parent).CheckboxHit(checkbox, toggleDirection) (ELSE ,SELF.parent.ControlHit(checkbox, toggleDirection); (END $ELSE (TDialogView(SELF.view).CheckboxHit(checkbox, toggleDirection); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialog.ControlHit(control: TDialogImage; toggleDirection: BOOLEAN); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF InClass(control, TButton) THEN (SELF.ButtonPushed(TButton(control)) {this branch perhaps not achievable in current design} $ELSE $IF InClass(control, TCheckbox) THEN (SELF.CheckboxHit(TCheckbox(control), toggleDirection); {Client can add own kinds by redefining this} #{$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TDialog.DownAt(mouseLPt: LPoint): TDialogImage; $VAR s: TListScanner; (dialogImage: TDialogImage; (currentDialogImage: TDialogImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $currentDialogImage := NIL; $IF SELF.Hit(mouseLPt) THEN (BEGIN (s := SELF.children.Scanner; (WHILE s.Scan(dialogImage) DO ,IF dialogImage.isActive THEN 0BEGIN 0currentDialogImage := dialogImage.DownAt(mouseLPt); 0IF currentDialogImage <> NIL THEN 4s.Done; 0END; (END; %DownAt := currentDialogImage; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialog.PushButton(button: TButton); {client or ToolKit may call} $PROCEDURE TurnOnTheJuice; (BEGIN (button.Highlight(hOffToOn); (END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF NOT button.isHighlighted THEN (SELF.view.panel.OnAllPadsDo(TurnOnTheJuice); $TDialogView(SELF.view).hitButton := button; $SELF.ButtonPushed(button); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgWarm} PROCEDURE TDialog.RecalcExtent; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SUPERSELF.RecalcExtent; {build up my size as the sum of the sizes of my children} $IF SELF.parent = NIL THEN (SELF.view.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TDialog.SetDefaultButton(button: TButton); $VAR thickPnSize: point; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.parent <> NIL THEN (TDialog(SELF.parent).SetDefaultButton(button) $ELSE (TDialogView(SELF.view).SetDefaultButton(button); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TDialog.SelectInputFrame(inputFrame: TInputFrame); $VAR panel: TPanel; (newFrameSel: TFrameSelection; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $panel := SELF.view.panel; $panel.BeginSelection; $newFrameSel := TFrameSelection(panel.selection.FreedAndReplacedBy( 9TFrameSelection.CREATE(NIL, SELF.Heap, inputFrame))); $newFrameSel.coSelection.Become( (inputFrame.textDialogImage.textImage.text.SelectAll( 8inputFrame.textDialogImage.textImage)); $panel.Highlight(panel.selection.coSelection, hOffToOn); ${$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; {-------------------------------------------------------------------------------------------------------} METHODS OF TButton; {$S DlgAlloc} FUNCTION TButton.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; )itsLocation: LPoint; itsMetrics: TButtonMetrics; )sameSizedButton: TButton; itsCmdNumber: TCmdNumber): TButton; $VAR buttonLRect: LRect; (itsLegend: TLegend; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SetLRect(buttonLRect, -1, 0, 1, 1); $OffsetLRect(buttonLRect, itsLocation.h, itsLocation.v); $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TButton(TImageWithID.CREATE(object, heap, buttonLRect, itsId, itsView, TRUE)); $WITH SELF DO (BEGIN (cmdNumber := itsCmdNumber; (buttonMetrics := itsMetrics; (isHighlighted := FALSE; '{minWidth will be set by RecalcExtent} (END; $IF sameSizedButton <> NIL THEN {weave me into chain of same-sized buttons} (BEGIN (SELF.nextSameSizedButton := sameSizedButton.nextSameSizedButton; (sameSizedButton.nextSameSizedButton := SELF; (END $ELSE (SELF.nextSameSizedButton := SELF; $itsLegend := NewStdLegend(heap, itsID, itsLocation.h, itsLocation.v, SELF.view, 0itsMetrics.typeStyle); $SELF.AddImage(itsLegend); $SELF.Resize(buttonLRect); {the AddImage will've made things out of balance} $SELF.legend := itsLegend; $itsLegend.wouldBeDraggable := FALSE; {as an entity unto itself during layout} $SELF.RecalcExtent; {performs lots of magic} ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TButton.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('cmdNumber: INTEGER'); $Field('minWidth: INTEGER'); $Field('isHighlighted: BOOLEAN'); $Field('nextSameSizedButton: TButton'); $Field('legend: TLegend'); $Field(CONCAT('buttonMetrics: RECORD height: INTEGER; curvH: INTEGER; curvV: INTEGER;', ,'typeStyle: LONGINT; expandNum: INTEGER; expandDen: INTEGER;', ,'absMinWidth: INTEGER; penState: ARRAY[1..18] OF Byte END')); $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TButton.DrawJustMe; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SetPenState(SELF.buttonMetrics.penState); $FrameLRRect(SELF.extentLRect, SELF.buttonMetrics.curvH, SELF.buttonMetrics.curvV); $IF SELF.isHighlighted THEN (InvrtLRRect(SELF.extentLRect, SELF.buttonMetrics.curvH, SELF.buttonMetrics.curvV); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TButton.Highlight(highTransit: THighTransit); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $InvrtLRRect(SELF.extentLRect, SELF.buttonMetrics.curvH, SELF.buttonMetrics.curvV); $SELF.isHighLighted := (highTransit = hOffToOn); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgLayout} FUNCTION TButton.LaunchLayoutBox(view: TView): TImage; $VAR layoutBox: TLayoutBox; (layBoxExtent: LRect; (s: TListScanner; (childLayoutBox: TLayoutBox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $LaunchLayoutBox := TButtonLayoutBox.CREATE(NIL, SELF.Heap, SELF, view); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TButton.MousePress(mouseLPt: LPoint); $PROCEDURE TurnOnButton; (BEGIN (SELF.HighLight(hOffToOn); (END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.view.panel.OnAllPadsDo(TurnOnButton); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TButton.MouseRelease; "BEGIN &{$IFC fTrace}BP(11);{$ENDC} &TDialog(SELF.parent).PushButton(SELF); &{$IFC fTrace}EP;{$ENDC} "END; {$S DlgAlloc} PROCEDURE TButton.RecalcExtent; $VAR dialogView: TDialogView; (curWidth: INTEGER; (timesThrough: INTEGER; (nextButton: TButton; (legend: TLegend; (paraImage: TParaImage; (width: INTEGER; (styleIndex: INTEGER; (oldLegendLoc: LPoint; (lRectToInval: LRect; (legLength: INTEGER; (textDialogImage: TTextDialogImage; (editLegendSelection:TEditLegendSelection; (paraExtent: LRect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $lRectToInval := SELF.extentLRect; $legend := TLegend(SELF.children.First); $oldLegendLoc := legend.location; $WITH legend.extentLRect DO (legLength := right - left; $WITH SELF, buttonMetrics DO {$H-} minWidth := MAX(absMinWidth, (legLength * expandNum) DIV expandDen); {$H+} $curWidth := SELF.minWidth; $FOR timesThrough := 1 TO 2 DO (BEGIN (nextButton := SELF.nextSameSizedButton; (WHILE nextButton <> SELF DO {send this round my circle of same-sized buttons} ,BEGIN ,nextButton.Recompute(curWidth); ,WITH nextButton.extentLRect DO 0curWidth := right - left; ,nextButton := nextButton.nextSameSizedButton; ,END; (SELF.Recompute(curWidth); (END; #UnionLRect(lRectToInval, SELF.extentLRect, lRectToInval); #IF TDialogView(SELF.view).isShowing THEN (SELF.view.panel.InvalLRect(lRectToInval); $IF SELF.parent <> NIL THEN (SELF.parent.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TButton.Recompute(minWidth: INTEGER); $VAR buttonWidth: INTEGER; (labelWidth: INTEGER; (legend: TLegend; (topLeft: LPoint; (shape: LRect; (offset: LPoint; (width: INTEGER; (curLegendWidth: INTEGER; (textExtent: LRect; (topCenter: LPoint; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $legend := SELF.legend; $topLeft := SELF.extentLRect.topLeft; $WITH topCenter, SELF.extentLRect DO (BEGIN (v := top; (h := (left + right) DIV 2; (END; $buttonWidth := SELF.minWidth; $IF buttonWidth < minWidth THEN (buttonWidth := minWidth; $SetParaExtent(legend.paragraph, SELF.view, zeroLPt, textExtent); $curLegendWidth := textExtent.right; $SetLPt(offset, (topCenter.h - (curLegendWidth DIV 2)) - legend.location.h, 3(topCenter.v + ((SELF.buttonMetrics.height DIV 2) + 3)) - legend.location.v); $legend.OffsetBy(offset); $SetLRect(shape, 0, 0, buttonWidth, SELF.buttonMetrics.height); $OffSetLRect(shape, topCenter.h - (buttonWidth DIV 2), topCenter.v); $SELF.Resize(shape); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TButton.StillMyMouse(mouseLPt: LPoint): BOOLEAN; {Called when the mouse which went down in me has moved; possibly it is no longer in me} $PROCEDURE TurnOffButton; (BEGIN (SELF.Highlight(hOnToOff); (END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN (StillMyMouse := TRUE {still in same button -- do nothing} $ELSE { no longer in the button ; need to unhilight and remove claim } (BEGIN (SELF.view.panel.OnAllPadsDo(TurnOffButton); (StillMyMouse := FALSE; {see if anyone else wants this guy} (END ; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; {-------------------------------------------------------------------------------------------------------} METHODS OF TCheckbox; {$S DlgAlloc} FUNCTION TCheckbox.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; ,itsLocation: LPoint; boxWidth: INTEGER; boxHeight: INTEGER; wantLabel: BOOLEAN; ,labelOffset: Point; itsTypeStyle: TTypeStyle): TCheckbox; $VAR extentLRect: LRect; (tempLRect: LRect; (rectImage: TRectImage; (stringLoc: LPoint; (itsString: TLegend; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SetLRect(extentLRect, 0, 0, boxWidth, boxHeight); $OffsetLRect(extentLRect, itsLocation.h, itsLocation.v); $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TCheckbox(TImageWithID.CREATE(object, heap, extentLRect, itsId, itsView, TRUE)); $SELF.isSelected := FALSE; $rectImage := TRectImage.CREATE(NIL, heap, extentLRect, noID, itsView, normalPen, FALSE); $SELF.AddImage(rectImage); $SELF.rectImage := rectImage; $IF wantLabel THEN (BEGIN (itsString := NewStdLegend(SELF.Heap, itsID, extentLRect.right + labelOffset.h, 4extentLRect.bottom + labelOffset.v, itsView, itsTypeStyle); (SELF.AddImage(itsString); (SELF.legend := itsString; (END $ELSE (SELF.legend := NIL; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TCheckbox.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('isSelected: BOOLEAN'); $Field('rectImage: TRectImage'); $Field('legend: TLegend'); $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TCheckbox.ChangeLabel(newS255: S255); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.legend = NIL THEN {$IFC fDbgOK} (ABCBreak('No legend to chg', 0) {later could perhaps launch a new label} {$ENDC} $ELSE (SELF.legend.ChangeString(newS255); $SELF.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TCheckbox.CursorAt(mouseLPt: LPoint): TCursorNumber; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN (CursorAt := checkCursor $ELSE (CursorAt := noCursor; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TCheckbox.Draw; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $PenNormal; $IF SELF.IsSelected THEN (FillLRect(SELF.rectImage.extentLRect, lPatBlack) {fill with black if selected} $ELSE (FillLRect(SELF.rectImage.extentLRect, lPatWhite); $SELF.rectImage.Draw; {draw the outline box in any case} $IF SELF.legend <> NIL THEN (SELF.legend.Draw; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgLayout} FUNCTION TCheckbox.LaunchLayoutBox(view: TView): TImage; $VAR layoutBox: TLayoutBox; (childLayoutBox: TLayoutBox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.legend <> NIL THEN {has string; use normal layout box} (LaunchLayoutBox := SUPERSELF.LaunchLayoutBox(view) $ELSE (BEGIN {a checkbox without an associated string} (childLayoutBox := TLayoutBox(SELF.rectImage.LaunchLayoutBox(view)); (layoutBox := TLayoutBox.CREATE(NIL, SELF.Heap, childLayoutBox.extentLRect, noID, NIL, ,view, SELF, zeroRect, FALSE, FALSE, TRUE); (layoutBox.AddImage(childLayoutBox); (LaunchLayoutBox := layoutBox; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TCheckbox.MousePress(mouseLPt: LPoint); {This proc is only called for mouspresses within "free check boxes", which is to say Checkboxes which are componenents of a dialogView -- NOT for Checkboxes which are subdialogImages of another dialogImage} $VAR carryOutTheToggle: BOOLEAN; (dialogView: TDialogView; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $carryOutTheToggle := TRUE; $dialogView := TDialogView(SELF.view); $IF dialogView.paintFreeBoxes THEN {need to worry about only toggling if in current sense} (BEGIN (IF dialogView.startedPainting THEN {have already started 'painting' free checkboxes} ,BEGIN ,IF dialogView.paintSense = SELF.isSelected THEN 0carryOutTheToggle := FALSE {already in the sense being painted--do nothing} ,END (ELSE {just starting painting; establish the painting sense} ,BEGIN ,dialogView.startedPainting := TRUE; ,dialogView.paintSense := NOT SELF.isSelected; ,END; (END; $IF carryOutTheToggle THEN 'BEGIN 'SELF.Toggle; 'dialogView.panel.InvalLRect(SELF.rectImage.extentLRect); 'SELF.ControlHit(SELF, SELF.isSelected); {pass it up to cluster and Dialog and even DialogView} 'END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TCheckbox.Toggle; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.isSelected := NOT SELF.isSelected; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; {-------------------------------------------------------------------------------------------------------} METHODS OF TCluster; {$S DlgAlloc} FUNCTION TCluster.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; ,itsLocation: LPoint): TCluster; 0VAR extentLRect: LRect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $WITH itsLocation DO (SetLRect(extentLRect, h, v, h + 1, v + 1); {include that pt in ultimate extent} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TCluster(TImageWithID.CREATE(object, heap, extentLRect, itsId, itsView, TRUE)); $WITH SELF DO (BEGIN (location := itsLocation; (hitBox := NIL; (hiLitBox := NIL; (lastBox := NIL; (END; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TCluster.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('location: LPoint'); $Field('hitBox: TCheckBox'); $Field('hiLitBox: TCheckBox'); $Field('lastBox: TCheckBox'); $Field(''); END; {$ENDC} {$S DlgAlloc} FUNCTION TCluster.AddAlignedCheckbox(itsId: S255; selectThisOne: BOOLEAN): TCheckbox; $CONST stdIncrement = 20; $VAR lastBox: TCheckbox; (location: LPoint; (itsBoxWidth: INTEGER; (itsBoxHeight: INTEGER; (checkBox: TCheckbox; (wantLabel: BOOLEAN; (labelOffset: Point; (vhs: VHSelect; (itsTypeStyle: TTypeStyle; (styleChange: TStyleChange; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $itsTypeStyle := sysTypeStyle; $wantLabel := (itsID <> noID); $labelOffset := stdLabelOffset; $itsBoxWidth := stdBoxWidth; $itsBoxHeight := stdBoxHeight; $lastBox := SELF.lastBox; $IF lastBox = NIL THEN {this is the first to be inserted} (location := SELF.location $ELSE {there is already at least one box in the cluster -- align to right of it & use its params} (BEGIN (WITH location DO ,BEGIN ,h := lastBox.extentLRect.right + stdIncrement; ,v := lastBox.rectImage.extentLRect.top; ,END; (WITH lastBox.rectImage.extentLRect DO ,BEGIN ,itsBoxWidth := right - left; ,itsBoxHeight := bottom - top; ,END; (IF wantLabel THEN ,BEGIN ,IF lastBox.legend <> NIL THEN {use same type style and label Offset as prev guy} 0BEGIN 0lastBox.legend.paragraph.typeStyles.GetAt(1, @styleChange); 0WITH lastBox, legend DO 4BEGIN 4itsTypeStyle := styleChange.newStyle; 4FOR vhs := v TO h DO 8labelOffset.vh[vhs] := location.vh[vhs] -  NIL THEN (checkbox.idNumber := lastBox.idNumber + 1; $AddAlignedCheckbox := checkbox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TCluster.NewAlignedCheckbox(itsPhrase: INTEGER; selectThisOne: BOOLEAN): TCheckbox; $VAR itsID: S255; (itsLocation: LPoint; (checkbox: TCheckbox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $checkbox := SELF.AddAlignedCheckbox(itsID, selectThisOne); $checkbox.idNumber := itsPhrase; $NewAlignedCheckbox := checkbox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TCluster.AddCheckbox(itsID: S255; itsLocation: LPoint; boxWidth: INTEGER; 5boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; 5itsTypeStyle: TTypeStyle; selectThisOne: BOOLEAN): TCheckbox; $VAR location: LPoint; (checkbox: TCheckbox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $checkbox := TCheckbox.CREATE(NIL, SELF.Heap, itsID, SELF.view, itsLocation, boxWidth, 4boxHeight, wantLabel, labelOffset, itsTypeStyle); $SELF.AddImage(checkbox); $SELF.lastBox := checkbox; $IF selectThisOne THEN (BEGIN (IF NOT checkbox.isSelected THEN ,checkbox.Toggle; (SELF.hiLitBox := checkbox; (END; $AddCheckbox := checkbox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} FUNCTION TCluster.NewCheckbox(itsPhrase: INTEGER; boxWidth: INTEGER; 3boxHeight: INTEGER; wantLabel: BOOLEAN; labelOffset: Point; itsTypeStyle: TTypeStyle; 3selectThisOne: BOOLEAN): TCheckbox; $VAR itsID: S255; (itsLocation: LPoint; (checkbox: TCheckbox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $GetTextAndLocation(itsPhrase, itsID, itsLocation); $checkbox := SELF.AddCheckbox(itsID, itsLocation, boxWidth, boxHeight, wantLabel, labelOffset, (itsTypeStyle, selectThisOne); $checkbox.idNumber := itsPhrase; $NewCheckbox := checkbox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgAlloc} PROCEDURE TCluster.AddRowOfBoxes(numberOfBoxes: INTEGER; startingIDNumber: INTEGER; 0boxWidth: INTEGER; boxHeight: INTEGER; boxSpacing: INTEGER); $VAR currentIDNumber: INTEGER; (checkbox: TCheckbox; (newLocation: LPoint; (newID: S255; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $FOR currentIDNumber := startingIDNumber TO (startingIDNumber + numberOfBoxes - 1) DO (BEGIN (IF SELF.lastBox = NIL THEN {this is the first to be inserted} ,newLocation := SELF.location (ELSE { There is already at least one box in the cluster -- align to right of it} ,WITH newLocation DO 0BEGIN 0h := SELF.lastBox.rectImage.extentLRect.right + boxSpacing; {??} 0v := SELF.lastBox.rectImage.extentLRect.top; 0END; (IntToString(currentIDNumber, @newID); (checkbox := SELF.AddCheckbox(newID, newLocation, boxWidth, boxHeight, FALSE, zeroPt, ,sysTypeStyle, FALSE); (checkBox.IDNumber := currentIDNumber; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TCluster.Hit(mouseLPt: LPoint): BOOLEAN; $VAR checkbox: TCheckbox; (s: TListScanner; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $Hit := FALSE; $IF LRectHasLPt(SELF.extentLRect, mouseLPt) THEN {passes coarsest hit test; look more deeply now} (BEGIN (s := SELF.children.Scanner; (WHILE s.Scan(checkbox) DO ,IF checkbox.Hit(mouseLPt) THEN 0BEGIN 0Hit := TRUE; 0SELF.hitBox := checkbox; 0s.Done; 0END; (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TCluster.MousePress(mouseLPt: LPoint); ${We are assured that when this is called, it will have been immediately &preceded by a successful call to TCluster.Hit . Hence, the field &TCluster.hitBox will correctly point to which guy was hit.} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.SelectBox(SELF.hitBox); {will deselect any other} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TCluster.SelectBox(checkbox: TCheckbox); {select this box, deselecting others} (PROCEDURE DrawUnHiLitBoxOnThePad; (BEGIN ,SELF.hiLitBox.Draw; {redraw old box unhilit} (END; (PROCEDURE DrawHiLitBoxOnThePad; (BEGIN ,checkbox.Draw; {toggle the newly selected one on} (END; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF (SELF.hiLitBox <> checkbox) AND (checkbox <> NIL) THEN (BEGIN (IF SELF.hiLitBox <> NIL THEN ,BEGIN ,SELF.hiLitBox.Toggle; ,SELF.view.panel.OnAllPadsDo(DrawUnHiLitBoxOnThePad); ,SELF.ControlHit(SELF.hiLitBox, FALSE); ,END; (SELF.hiLitBox := checkbox; {set new box as the currently hilit one} (checkbox.Toggle; (SELF.view.panel.OnAllPadsDo(DrawHiLitBoxOnThePad); (SELF.ControlHit(checkbox, TRUE); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TCluster.StillMyMouse(mouseLPt: LPoint): BOOLEAN; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN {mouse is in a box of the cluster} (BEGIN (SELF.SelectBox(SELF.hitBox); {will toggle any alternate box off} (StillMyMouse := TRUE; (END $ELSE {mouse not in any of my box's hit areas at the moment} (StillMyMouse := FALSE; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; METHODS OF TInputFrame; {$S DlgAlloc} FUNCTION TInputFrame.CREATE(object: TObject; heap: THeap; itsId: S255; itsView: TView; (promptLocation: LPoint; promptTypeStyle: TTypeStyle; (inputLocation: LPoint; inputTypeStyle: TTypeStyle; maxInputChars: INTEGER; (itsBorders: Rect; drawInputLRect: BOOLEAN; drawHitLRect: BOOLEAN): TInputFrame; $VAR textExtent: LRect; (myOwnExtentLRect: LRect; (prompt: TLegend; (textDialogImage: TTextDialogImage; {$IFC libraryVersion <= 20} {* * * P E P S I * * *} (fInfo: TFInfo; {$ELSEC} {* * S P R I N G * *} (fInfo: FontInfo; {$ENDC} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $prompt := TLegend.CREATE(NIL, heap, itsID, itsView, promptLocation, promptTypeStyle); $SetQDTypeStyle(inputTypeStyle); $GetFontInfo(fInfo); $WITH fInfo DO (SetLRect(textExtent, 0, -ascent - leading, maxInputChars * widMax, descent + leading); $OffsetLRect(textExtent, inputLocation.h, inputLocation.v); $textDialogImage := TTextDialogImage.CREATE(NIL, heap, textExtent, 'input', itsView, (inputTypeStyle, ''); $UnionLRect(prompt.extentLRect, textDialogImage.extentLRect, myOwnExtentLRect); $LRectAddBorders(myOwnExtentLRect, itsBorders, myOwnExtentLRect); $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TInputFrame(TImageWithID.CREATE(object, heap, myOwnExtentLRect, itsId, itsView, TRUE)); $SELF.prompt := prompt; $SELF.AddImage(prompt); $SELF.textDialogImage := textDialogImage; $SELF.AddImage(textDialogImage); $SELF.inputTypeStyle := inputTypeStyle; $SELF.maxInputChars := maxInputChars; $SELF.drawHitLRect := drawHitLRect; $SELF.drawInputLRect := drawInputLRect; $SELF.borders := itsBorders; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TInputFrame.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('textDialogImage: TTextDialogImage'); $Field('prompt: TLegend'); $Field('borders: Rect'); $Field('drawInputLRect: BOOLEAN'); $Field('drawHitLRect: BOOLEAN'); $Field('maxInputChars: INTEGER'); $Field('inputTypeStyle: LONGINT'); {make this right someday} $Field(''); END; {$ENDC} {$S DlgText} FUNCTION TInputFrame.CursorAt(mouseLPt: LPoint): TCursorNumber; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.Hit(mouseLPt) THEN ,CursorAt := textCursor (ELSE ,CursorAt := noCursor; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgText} PROCEDURE TInputFrame.Draw; (VAR tempLRect: LRect; ,pat: pattern; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.prompt <> NIL THEN ,SELF.prompt.Draw; (SELF.textDialogImage.Draw; {draw the current input characters lying there...} (IF SELF.drawInputLRect THEN ,BEGIN ,tempLRect := SELF.textDialogImage.textImage.extentLRect; ,InsetLRect(tempLRect, -6, -4); ,PenNormal; ,thePad.LPatToPat(lPatGray, pat); ,PenPat(pat); ,PenSize(1,1); ,FrameLRect(tempLRect); {mostly for debugging reassurance...} ,END; (IF SELF.drawHitLRect THEN ,FrameLRect(SELF.extentLRect); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} FUNCTION TInputFrame.LaunchLayoutBox(view: TView): TImage; {In the future, if there were one, we would want to allow resizing of the hit area during "layout, and would here launch a special type of layout box, TInptFrmLayoutBox, to do layout just right} $VAR layoutBox: TLayoutBox; (layBoxExtent: LRect; (s: TListScanner; (childLayoutBox: TLayoutBox; (newBorders: Rect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $layoutBox := TLayoutBox(SUPERSELF.LaunchLayoutBox(view)); {i.e., TImageWithID's launch} $WITH layoutBox.borders DO (BEGIN (top := SELF.borders.top; (right := SELF.borders.right - right; (bottom := SELF.borders.bottom - bottom; (left := SELF.borders.left - left; (END; $layoutBox.RecalcExtent; $LaunchLayoutBox := layoutBox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgText} PROCEDURE TInputFrame.MousePress(mouseLPt: LPoint); $VAR frameSelection: TFrameSelection; BEGIN ${$IFC fTrace}BP(11);{$ENDC} %LRectHaveLPt(SELF.textDialogImage.textImage.extentLRect, mouseLPt); %TDialogView(SELF.view).magnetCursor := textCursor; %frameSelection := TFrameSelection(SELF.view.panel.selection.FreedAndReplacedBy( HTFrameSelection.CREATE(NIL, SELF.Heap, SELF))); %SELF.textDialogImage.textImage.MousePress(mouseLPt); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgText} PROCEDURE TInputFrame.GetContents(VAR theStr: S255); $VAR paraImage: TParaImage; (paragraph: TParagraph; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $paraImage := TParaImage(SELF.textDialogImage.textImage.imageList.First); $paragraph := paraImage.paragraph; $paragraph.ToPStr(@theStr); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgLayout} PROCEDURE TInputFrame.RecalcExtent; $VAR newExtent: LRect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.prompt <> NIL THEN ,UnionLRect(SELF.prompt.extentLRect, SELF.textDialogImage.extentLRect, newExtent) (ELSE ,newExtent := SELF.textDialogImage.extentLRect; (LRectAddBorders(newExtent, SELF.borders, newExtent); (SELF.Resize(newExtent); (IF SELF.parent <> NIL THEN ,SELF.parent.RecalcExtent; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgText} FUNCTION TInputFrame.StillMyMouse(mouseLPt: LPoint): BOOLEAN; "{in this implementation, once the insertion point has been dropped, we don't give up $control even if user now strays outside our hit area} $BEGIN ({$IFC fTrace}BP(11);{$ENDC} )LRectHaveLPt(SELF.textDialogImage.textImage.extentLRect, mouseLPt); )SELF.view.panel.selection.coSelection.MouseMove(mouseLPt); {currently, just pass it on to the ftext selection} )StillMyMouse := TRUE; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgText} PROCEDURE TInputFrame.SupplantContents(newStr: S255); $VAR paragraph: TParagraph; (paraImage: TParaImage; (textImage: TTextImage; (oldCount: INTEGER; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (textImage := SELF.textDialogImage.textImage; (paraImage := TParaImage(textImage.imageList.First); (paragraph := paraImage.paragraph; (oldCount := paragraph.size; (paragraph.ReplPString(0, oldCount, @newStr); (paraImage.changed := TRUE; (paraImage.InvalLinesWith(0, MAXINT); (textImage.RecomputeImages(actionNone, TRUE); (IF TDialogView(SELF.view).isShowing THEN ,SELF.view.panel.InvalLRect(SELF.textDialogImage.extentLRect); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLegend; {$S TK2Start} FUNCTION TLegend.CREATE(object: TObject; heap: THeap; itsChars: S255; itsView: TView; ,itsLocation: LPoint; itsTypeStyle: TTypeStyle): TLegend; $VAR itsExtent: LRect; (height: INTEGER; (itsParagraph: TParagraph; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $itsParagraph := TParagraph.CREATE(NIL, heap, LENGTH(itsChars), itsTypeStyle); $itsParagraph.InsPStrAt(1, @itsChars); $SetParaExtent(itsParagraph, itsView, itsLocation, itsExtent); $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TLegend(TDialogImage.CREATE(object, heap, itsExtent, noID, itsView, FALSE)); $WITH SELF DO (BEGIN (location := itsLocation; (paragraph := itsParagraph; (wouldBeDraggable := TRUE; (usesSysFont := (itsTypeStyle.font.fontFamily = famSystem); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TLegend.Free; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $Free(SELF.paragraph); $SUPERSELF.Free; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TLegend.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('location: LPoint'); $Field('paragraph: TParagraph'); $Field('wouldBeDraggable: BOOLEAN'); $Field('usesSysFont: BOOLEAN'); $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TLegend.ChangeToPhrase(newPhrase: INTEGER); $VAR newString: S255; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $process.GetAlert(newPhrase, newString); $SELF.ChangeString(newString); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.ChangeString(newString: S255); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.view.panel.InvalLRect(SELF.extentLRect); {invalidate old string's bounding box} $SELF.paragraph.DelAll; $SELF.paragraph.InsPStrAt(1, @newString); $SELF.GetBoxRight; $SELF.view.panel.InvalLRect(SELF.extentLRect); {invalidate new string's bounding box} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.Draw; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $MoveToL(SELF.location.h, SELF.location.v); $SELF.paragraph.Draw(1, SELF.paragraph.size); ${$IFC fTrace}EP;{$ENDC} END; {$S TK2Start} PROCEDURE TLegend.GetBoxRight; $VAR newExtent: LRect; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SetParaExtent(SELF.paragraph, SELF.view, SELF.location, newExtent); $SELF.Resize(newExtent); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.GetString(VAR itsString: S255); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.paragraph.ToPStr(@itsString); ${$IFC fTrace}EP;{$ENDC} END; {$S SgLayout} FUNCTION TLegend.LaunchLayoutBox(view: TView): TImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.isEditable THEN (LaunchLayoutBox := TLegendLayoutBox.CREATE(NIL, SELF.Heap, view, SELF) $ELSE (LaunchLayoutBox := SUPERSELF.LaunchLayoutBox(view); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.OffsetBy(deltaLPt: LPoint); BEGIN ${$IFC fTrace}BP(11);{$ENDC} {$H-} LPtPlusLPt(SELF.location, deltaLPt, SELF.location); {$H+} $SUPERSELF.OffsetBy(deltaLPt); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TLegend.RecalcExtent; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.GetBoxRight; $IF SELF.parent <> NIL THEN (SELF.parent.RecalcExtent; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; 3. "6F^9; D!$ǐ^.((lL, FALSE).Init(imageList); Bar], w} d int, de} nipulee} {---} dngLayoutBox; $FUNCTION TLgHdngLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; OVERRIDE; $PROCEDURE TLgH0NewCommand := NIL; 0END; ,OTHERWISE 0NewCommand := SUPERSELF.NewCommand(cmdNumber); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $PROCEDURE TDialogDesignWindow.RelinquishControl; 0{not yet: install in resourceFile} {UDialog3} {COPYRIGHT 1984 BY APPLE COMPUTER, INC} (* $TPicObject -- TRectImage -- TTextDialogImage - TFrameSelection - $TPlannerView - TLayoutBox - TLegendLayoutBox - ButtonLayoutBox - TTitleTab - $TLayPickSelection - TLayMoveCommand - TEditLegendSelection - TDialogDesignWindow *) {04/25/84 1610 Switched back to using a paraImage in call to FilterAndDo, as per JKD's latest change, 3in TLegendLayoutBox.RecalcExtent 0Removed the inval in TLegendLayoutBox.MousePress, fExperimenting or not} {04/25/84 0015 Added TEditLegendSelection.MousePress, MouseMove and MouseRelease and field tripleClick, 4to trap triple-click and do a SelectAll with it} {04/23/84 1210 Removed all references to 'underEdit' field of TDialogImage 0TEditLegendSelection.Deselect, Free, and Restore changed. 0Removed some commented-out code and some unused VAR declarations in the TEditLegendSel 3methods changed} {04/17/84 2130 In TEditLegendSelection.CREATE doesn't inval unless fExperimenting 0Removed ABCBreak calls in TEditLegendSelection.CREATE, TFrameSelection.KeyChar 0TLegendLayoutBox.Draw always keys on existence of SELF.textDialogImage, ignoring 5underEdit flag; underEdit, if this is okay, can vanish completely from the architecture} {04/17/84 2000 In TLegendLayoutBox.RecalcExtent, try to use TImage.FilterAndDo correctly} {04/15/84 2000 Spring Prelim Release} {01/29/84 1754 RELEASE TK8D} {12/22/83 1927 RELEASE TK8A} METHODS OF TPicObject; {$S DlgCold} FUNCTION TPicObject.CREATE(object: TObject; heap: THeap; itsId: S255; ,itsView: TView; itsLocation: LPoint; itsPicHandle: PicHandle): TPicObject; VAR tempHz: THeap; $frameInView: LRect; $myPicHandle: PicHandle; $boxAtCreation: Rect; BEGIN ${$IFC fTrace}BP(7);{$ENDC} $boxAtCreation:= itsPicHandle^^.picFrame; $noPad.rectToLRect(boxAtCreation, frameInView); $OffsetLRect(frameInView, itsLocation.h, itsLocation.v); $IF object = NIL THEN 'object := NewObject(heap, THISCLASS); $SELF := TPicObject(TImageWithID.CREATE(object, heap, frameInView, itsId, itsView, FALSE {no children})); $SELF.isEditable := FALSE; $SELF.boxAtCreation := boxAtCreation; $GetHeap(tempHz); $SetHeap(SELF.Heap); $myPicHandle := OpenPicture(SELF.boxAtCreation); {replay the incoming picture file onto our own heap} $SELF.picture := myPicHandle; $DrawPicture(itsPicHandle, SELF.boxAtCreation); $ClosePicture; $SetHeap(tempHz); {restore normal heap} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgCold} PROCEDURE TPicObject.Free; BEGIN #{$IFC fTrace}BP(7);{$ENDC} #KillPicture(SELF.picture); #SUPERSELF.Free; #{$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TPicObject.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('picHandle: LONGINT'); $Field('boxAtCreation: Rect'); $Field(''); END; {$ENDC} {$S DlgCold} PROCEDURE TPicObject.Draw; VAR boxOnPad: Rect; BEGIN #{$IFC fTrace}BP(7);{$ENDC} #thePad.LRectToRect(SELF.extentLRect, boxOnPad); #DrawPicture(SELF.picture, boxOnPad); #{$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; METHODS OF TRectImage; {$S DlgAlloc} FUNCTION TRectImage.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; $itsView: TView; itsPenState: PenState; withChildren: BOOLEAN): TRectImage; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TRectImage(TDialogImage.CREATE(object, heap, itsExtent, itsId, itsView, withChildren)); $SELF.penState := itsPenState; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TRectImage.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field(CONCAT('penState: RECORD pnLoc: Point; pnSize: Point; pnMode: INTEGER;', 1'pnPat: ARRAY[0..7] OF Byte END')); {actually a packed array--fix} $Field(''); END; {$ENDC} {$S DlgHot} PROCEDURE TRectImage.Draw; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SetPenState(SELF.penState); {could first want to scale the pen size, via the Pad...} $FrameLRect(SELF.extentLRect); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgLayout} FUNCTION TRectImage.LaunchLayoutBox(view: TView): TImage; $VAR newBox: TLayoutBox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $newBox := TLayoutBox.CREATE(NIL, SELF.Heap, SELF.extentLRect, noID, NIL, (view, SELF, stdThinBorders, TRUE, TRUE, FALSE); $LaunchLayoutBox := newBox; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; {-------------------------------------------------------------------------------------------------------} METHODS OF TTextDialogImage; {$S DlgText} FUNCTION TTextDialogImage.CREATE(object: TObject; heap: THeap; itsExtent: LRect; itsId: S255; .itsView: TView; itsTypeStyle: TTypeStyle; itsInitialChars: S255): TTextDialogImage; $VAR textimage: TTextImage; (editPara: TEditPara; (paraFormat: TParaFormat; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TTextDialogImage(TImageWithID.CREATE(object, heap, itsExtent, itsId, itsView, FALSE)); $textImage := TTextImage.CREATE(NIL, heap, itsView, itsExtent, )TText.CREATE(NIL, heap, TDialogView(itsView).styleSheet), TRUE); $textImage.text.txtImgList.InsLast(textImage); $paraFormat := TParaFormat.CREATE(NIL, heap, NIL); $paraFormat.dfltTStyle := itsTypeStyle; $editPara := TEditPara.CREATE(NIL, heap, 0, paraFormat); $textImage.imageList.InsLast(textImage.NewParaImage(editPara, itsExtent, 0, 0)); $textImage.text.paragraphs.InsLast(editPara); $editPara.ReplPString(0, editPara.size, @itsInitialChars); $SELF.textImage := textImage; $textImage.RecomputeImages(actionNone, TRUE); $SELF.wouldBeDraggable := TRUE; $SELF.refCount := 1; ${$IFC fTrace}EP;{$ENDC} END; {$S SgTxtRes} PROCEDURE TTextDialogImage.Free; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.textImage.text.Free; $SUPERSELF.Free; ${$IFC fTrace}EP;{$ENDC} END; PROCEDURE TTextDialogImage.ChangeRefCountBy(delta: INTEGER); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.refCount := SELF.refCount + delta; $IF SELF.refCount <= 0 THEN (SELF.Free; ${$IFC fTrace}EP;{$ENDC} END; {$IFC fDebugMethods} {$S DlgDbg} PROCEDURE TTextDialogImage.Fields(PROCEDURE Field(nameAndType: S255)); BEGIN $SUPERSELF.Fields(Field); $Field('textImage: TTextImage'); $Field('wouldBeDraggable: BOOLEAN'); $Field('refCount: INTEGER'); $Field(''); END; {$ENDC} {$S DlgHot} FUNCTION TTextDialogImage.CursorAt(mouseLPt: LPoint): TCursorNumber; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF SELF.Hit(mouseLPt) THEN (CursorAt := textCursor $ELSE {not mine} (CursorAt := noCursor; ${$IFC fTrace}EP;{$ENDC} END; {$S SgTxtRes} PROCEDURE TTextDialogImage.Draw; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.textImage.Draw; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgLayout} FUNCTION TTextDialogImage.LaunchLayoutBox(view: TView): TImage; $VAR borders: Rect; (newBox: TLayoutBox; BEGIN ${$IFC fTrace}BP(11);{$ENDC} {dubious--formerly intended uses in abeyance} $IF SELF.wouldBeDraggable THEN (borders := stdPlainBorders $ELSE (borders := zeroRect; $newBox := TLayoutBox.CREATE(NIL, SELF.Heap, SELF.extentLRect, noID, NIL {parent}, (view, SELF, borders, FALSE, FALSE, FALSE); $newBox.wouldMakeSelection := TRUE; $newBox.suppressDrawingManipulee := FALSE; $newBox.isDraggable := SELF.wouldBeDraggable; $LaunchLayoutBox := newBox; ${$IFC fTrace}EP;{$ENDC} END; {$S SgTxtRes} PROCEDURE TTextDialogImage.MousePress(mouseLPt: LPoint); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.textImage.MousePress(mouseLPt); ${$IFC fTrace}EP;{$ENDC} END; {$S SgTxtRes} PROCEDURE TTextDialogImage.OffsetBy(deltaLPt: LPoint); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.textImage.OffsetBy(deltaLPt); $SUPERSELF.OffsetBy(deltaLPt); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; METHODS OF TFrameSelection; {$S DlgHot} FUNCTION TFrameSelection.CREATE(object: TObject; heap: THeap; (itsInputFrame: TInputFrame): TFrameSelection; $VAR coSelection: TSelection; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF object = NIL THEN (object := NewObject(heap, THISCLASS); $SELF := TFrameSelection(TSelection.CREATE(object, heap, itsInputFrame.view, NframeKind, zeroLPt)); $SELF.inputFrame := itsInputFrame; $SELF.boundLRect := itsInputFrame.textDialogImage.extentLRect; $coSelection := itsInputFrame.view.NoSelection; {put non-NIL coSelection} $SELF.coSelection := coSelection; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} FUNCTION TFrameSelection.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; BEGIN ${$IFC fTrace}BP(10);{$ENDC} $CASE cmdNumber OF (uModern, uClassic,u20Pitch, u15Pitch, u12Pitch, u10Pitch, u12Point, u14Point, u18Point, u24Point, (uPlain, uBold, uItalic, uUnderline, uShadow, uOutline: ,CanDoCommand := FALSE; {before coSelection could set to TRUE} (OTHERWISE ,CanDoCommand := SUPERSELF.CanDoCommand(cmdNumber, checkIt); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.KeyChar(ch: CHAR); $VAR paraImage: TParaImage; (maxCharsString: S255; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $paraImage := TParaImage(SELF.inputFrame.textDialogImage.textImage.imageList.First); $IF (SELF.inputFrame.maxInputChars > paraImage.paragraph.size) OR '(NOT InClass(SELF.coSelection, TInsertionPoint)) THEN {can accept more} (SELF.coSelection.KeyChar(ch) $ELSE (BEGIN (IntToStr(SELF.inputFrame.maxInputChars, @maxCharsString); (process.ArgAlert(1, maxCharsString); (process.Stop(phTooManyChars); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.KeyEnter(dh, dv: INTEGER); BEGIN ${$IFC fTrace}BP(11);{$ENDC} $IF (dh <> 0) OR (dv <> 0) THEN (SELF.KeyTab((dh < 0) OR (dv < 0)); {right and down keys are Forward} ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.KeyReturn; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SELF.KeyTab(FALSE); ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.KeyTab(fBackward: BOOLEAN); $VAR dialogView: TDialogView; (dialogImage: TDialogImage; (s: TListScanner; (passedGo: BOOLEAN; (foundSuccessor: BOOLEAN; (prevInputFrame: TInputFrame; (nextInputFrame: TInputFrame; (newFrameSel: TFrameSelection; (dialog: TDialog; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $dialogView := TDialogView(SELF.view); $prevInputFrame := NIL; $passedGo := FALSE; $foundSuccessor := FALSE; $dialog := TDialog(SELF.inputFrame.parent); $s := dialog.children.Scanner; $WHILE s.Scan(dialogImage) DO (BEGIN (IF dialogImage = SELF.inputFrame THEN {found current frame} ,BEGIN ,IF not fBackward THEN 0passedGo := TRUE ,ELSE {back-tab; use most recent input frame, if any} 0BEGIN 0IF prevInputFrame = NIL THEN {there is none; can't do anything} 4s.Done {with foundSuccessor still FALSE} 0ELSE {found somebody!} 4BEGIN 4nextInputFrame := prevInputFrame; 4foundSuccessor := TRUE; 4END; 0END; ,END; (IF InClass(dialogImage, TInputFrame) THEN ,IF (passedGo AND (dialogImage <> SELF.inputFrame)) OR foundSuccessor THEN 0BEGIN 0IF passedGo THEN 4nextInputFrame := TInputFrame(dialogImage); {else it's already set, if back-tab} 0SELF.KeyPause; 0dialog.SelectInputFrame(nextInputFrame); 0foundSuccessor := TRUE; 0s.Done; 0END {forward tabbing actually done} ,ELSE 0prevInputFrame := TInputFrame(dialogImage); (END; {scan of dialogImages} $IF NOT foundSuccessor THEN (SELF.CantDoIt; ${ELSE (SELF.window.CommitLast}; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.MousePress(mouseLPt: LPoint); {called only if mouse comes BACK down inside alredy-selected Input Frame} BEGIN ${$IFC fTrace}BP(11);{$ENDC} $SUPERSELF.MousePress(mouseLPt); $TDialogView(SELF.view).magnetCursor := textCursor; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.PerformCommand(command: TCommand; cmdPhase: TCmdPhase); $VAR paragraph: TParagraph; (textImage: TTextImage; (paraImage: TParaImage; (noSelection: TSelection; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $textImage := SELF.inputFrame.textDialogImage.textImage; $SUPERSELF.PerformCommand(command, cmdPhase); $paraImage := TParaImage(textImage.imageList.First); $paragraph := paraImage.paragraph; $paragraph.NewStyle(0, paragraph.Size, SELF.inputFrame.inputTypeStyle); $IF paragraph.size > SELF.inputFrame.maxInputChars THEN (BEGIN {may need temp para here} (paragraph.ReplPara(0, paragraph.size, paragraph, 0, SELF.inputFrame.maxInputChars); (paraImage.changed := TRUE; (paraImage.InvalLinesWith(0, MAXINT); (textImage.RecomputeImages(actionNone, TRUE); (SELF.window.CommitLast; (noSelection := SELF.FreedAndReplacedBy(SELF.view.NoSelection); (END; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgHot} PROCEDURE TFrameSelection.Restore; BEGIN ${$IFC fTrace}BP(11);{$ENDC} $TDialogView(SELF.view).currentDialogImage := SELF.inputFrame; $SUPERSELF.Restore; ${$IFC fTrace}EP;{$ENDC} END; {$S DlgInit} END; METHODS OF TPlannerView; {$S SgLayout} $FUNCTION TPlannerView.CREATE(object: TObject; heap: THeap; itsViewBeingPlanned: TView; EitsPanel: TPanel; itsAllowSketching: BOOLEAN; EitsRetainPickedBox: BOOLEAN): TPlannerView; (VAR newList: TList; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TPlannerView(TDialogView.CREATE(object, heap, itsViewBeingPlanned.extentLRect, itsPanel, 4NIL, itsViewBeingPlanned.res)); (WITH SELF DO ,BEGIN ,viewBeingPlanned := itsViewBeingPlanned; ,allowSketching := itsAllowSketching; ,retainPickedBox := itsRetainPickedBox; ,currentLayoutBox := NIL; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} {$S DlgDbg} $PROCEDURE TPlannerView.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('viewBeingPlanned: TView'); (Field('allowSketching: BOOLEAN'); (Field('retainPickedBox: BOOLEAN'); (Field('currentLayoutBox: TLayoutBox'); (Field(''); $END; ${$ENDC} {$S SgLayout} $FUNCTION TPlannerView.CursorAt(mouseLPt: LPoint): TCursorNumber; $VAR s: TListScanner; (layoutBox: TLayoutBox; (curCursor: TCursorNumber; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.mouseIsDown AND (SELF.magnetCursor <> noCursor) THEN ,CursorAt := SELF.magnetCursor (ELSE ,BEGIN ,curCursor := noCursor; ,s := SELF.rootDialog.children.Scanner; ,WHILE s.Scan(layoutBox) DO 0BEGIN 0curCursor := layoutBox.CursorAt(mouseLPt); 0IF curCursor <> noCursor THEN 4s.Done 0END; ,CursorAt := curCursor; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TPlannerView.Draw; (PROCEDURE DrawLayoutBox(obj: TObject); (VAR layoutBox: TLayoutBox; (BEGIN ,layoutBox := TLayoutBox(obj); ,layoutBox.Draw; (END; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (SELF.EachActualPart(DrawLayoutBox); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TPlannerView.EachActualPart(PROCEDURE DoToObject(filteredObj: TObject)); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} )SELF.rootDialog.children.Each(DoToObject); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgAlloc} $PROCEDURE TPlannerView.Init(itsListOfImages: TList); (VAR s: TListScanner; ,t: TListScanner; ,image: TImage; ,layoutBox: TLayoutBox; ,otherLayoutBox: TLayoutBox; ,nextButton: TButton; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (IF itsListOfImages <> NIL THEN ,BEGIN ,s := itsListOfImages.Scanner; {create parallel structure} ,WHILE s.Scan(image) DO 0BEGIN 0layoutBox := SELF.NewLayoutBox(image); 0IF layoutBox <> NIL THEN 4SELF.rootDialog.AddImage(layoutBox); {it may well have its own children, already created} 0END; ,END; (IF InClass(SELF.viewBeingPlanned, TDialogView) THEN {get buttonLayoutBoxes correctly entwined} ,BEGIN ,s := SELF.rootDialog.children.Scanner; ,WHILE s.Scan(layoutBox) DO 0IF InClass(layoutBox, TButtonLayoutBox) THEN 4BEGIN 4nextButton := TButton(layoutBox.manipulee).nextSameSizedButton; 4t := SELF.rootDialog.children.Scanner; 4WHILE t.Scan(otherLayoutBox) DO 8IF otherLayoutBox.manipulee = nextButton THEN {found it}  nothingKind) AND (panel.selection.kind <> layPickKind) THEN ,BEGIN ,IF clickState.fShift THEN 0madeSelection := TRUE ,ELSE ,IF InClass(panel.selection, TEditLegendSelection) THEN 0BEGIN 0editLegendSelection := TEditLegendSelection(panel.selection); 0IF LPtInLRect(mouseLPt, editLegendSelection.legendLayoutBox.extentLRect) THEN 4IF NOT LPtInLRect(mouseLPt, editLegendSelection.legendLayoutBox.titleTab.extentLRect) THEN 8BEGIN 8madeSelection := TRUE; 8SELF.magnetCursor := textCursor; 8END; 0END; ,END; (IF madeSelection THEN ,panel.selection.MousePress(mouseLPt) (ELSE ,BEGIN ,panel.BeginSelection; ,pickedBox := NIL; {find who wants the mouse} ,s := SELF.rootDialog.children.Scanner; ,WHILE s.Scan(layoutBox) DO 0BEGIN 0layoutBox.ConsiderMouse(mouseLPt, madeSelection, pickedBox); 0IF pickedBox <> NIL THEN 4pickedBox.ComeForward; 0IF madeSelection THEN 4s.Done 0ELSE 0IF (pickedBox <> NIL) THEN {got the title tab of somebody} 4BEGIN 4pickedBox.ChangeDragState(TRUE); 4layPickSelection := TLayPickSelection(panel.selection.FreedAndReplacedBy( DTLayPickSelection.CREATE(NIL, SELF.Heap, SELF, layPickKind, pickedBox, DmouseLPt))); 4panel.OnAllPadsDo(InvrtOnThePad); 4SELF.magnetCursor := arrowCursor; 4s.Done; 4END 0END; (* NB: Here, when/if we allow sketching in layout, we would add code like: (IF pickedBox = NIL THEN 0IF SELF.allowSketching THEN 4LaySketchSelection := TLaySketchSelection(panel.selection.FreedAndReplacedBy( DTLaySketchSelection.CREATE(NIL, SELF.Heap, SELF, mouseLPt))) *) ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $PROCEDURE TPlannerView.MouseMove(mouseLPt: LPoint); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (TView.MouseMove(mouseLPt); {do NOT do what TDialogView would do} '{$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TPlannerView.MouseRelease; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.mouseIsDown := FALSE; (SELF.magnetCursor := noCursor; (TView.MouseRelease; {do NOT do what TDialogView would do except for the above} ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLayoutBox; {$S SgLayout} $FUNCTION TLayoutBox.CREATE(object: TObject; heap: THeap; baseExtent: LRect; itsID: S255; 0itsParent: TLayoutBox; itsView: TView; itsManipulee: TImage; itsBorders: Rect; 0itsResizable: BOOLEAN; itsSuppression: BOOLEAN; withChildren: BOOLEAN): TLayoutBox; (VAR itsTitleTab: TTitleTab; ,itsExtentLRect: LRect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (LRectAddBorders(baseExtent, itsBorders, itsExtentLRect); (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TLayoutBox(TImageWithID.CREATE(object, heap, itsExtentLRect, itsID, itsView, withChildren)); (IF itsBorders.top = 0 THEN ,itsTitleTab := SELF.NoTitleTab(SELF.Heap) (ELSE ,itsTitleTab := TTitleTab.CREATE(NIL, heap, SELF, - itsBorders.bottom - itsBorders.top + 1, PitsID); (WITH SELF DO ,BEGIN ,parent := itsParent; ,titleTab := itsTitleTab; ,manipulee := itsManipulee; ,suppressDrawingManipulee := itsSuppression; ,wouldMakeSelection := FALSE; ,isResizable := itsResizable; ,isDraggable := TRUE; ,shouldFrame := TRUE; ,borders := itsBorders; ,hasDraggee := FALSE; ,END; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.Free; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (Free(SELF.titleTab); (SUPERSELF.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TLayoutBox.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('manipulee: TImage'); (Field('titleTab: TTitleTab'); (Field('suppressDrawingManipulee: BOOLEAN'); (Field('isResizable: BOOLEAN'); (Field('borders: Rect'); (Field('wouldMakeSelection: BOOLEAN'); (Field('isDraggable: BOOLEAN'); (Field('shouldFrame: BOOLEAN'); (Field('hasDraggee: BOOLEAN'); (Field(''); $END; ${$S SgLayout} ${$ENDC} $PROCEDURE TLayoutBox.ChangeDragState(enteringDrag: BOOLEAN); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.hasDraggee := enteringDrag; (IF SELF.parent <> NIL THEN ,IF InClass(SELF.parent, TLayoutBox) THEN 0TLayoutBox(SELF.parent).ChangeDragState(enteringDrag); ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.ConsiderMouse(mouseLPt: LPoint; VAR madeSelection: BOOLEAN; ,VAR pickedLayoutBox: TLayoutBox); (VAR s: TListScanner; ,layoutBox: TLayoutBox; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (pickedLayoutBox := NIL; (madeSelection := FALSE; (IF NOT SELF.Hit(mouseLPt) THEN ,{it ain't me} (ELSE ,BEGIN ,IF LRectHasLPt(SELF.titleTab.extentLRect, mouseLPt) THEN 0BEGIN 0pickedLayoutBox := SELF; 0SELF.TabGrabbed; {so that page status dialog can react now} 0END ,ELSE ,IF SELF.wouldMakeSelection THEN 0BEGIN 0madeSelection := TRUE; 0pickedLayoutBox := SELF; 0SELF.MousePress(mouseLPt); 0END ,ELSE {not my title tab, and I myself don't make selections; how about it, kids?} 0BEGIN 0IF SELF.children <> NIL THEN 4BEGIN 4s := SELF.children.Scanner; 4WHILE s.Scan(layoutBox) DO 8BEGIN 8layoutBox.ConsiderMouse(mouseLPt, madeSelection, pickedLayoutBox); 8IF madeSelection OR (pickedLayoutBox <> NIL) THEN  NIL THEN 0IF SELF.titleTab.Hit(mouseLPt) THEN 4curCursor := arrowCursor; ,IF curCursor = noCursor THEN 0IF SELF.children <> NIL THEN 4BEGIN 4s := SELF.children.Scanner; 4WHILE s.Scan(layoutBox) DO 8BEGIN 8curCursor := layoutBox.CursorAt(mouseLPt); 8IF curCursor <> noCursor THEN  NIL THEN {currently every layout box MUST have a title tab, so this is Funnecessary} 0IF NOT EmptyLRect(titleTab.extentLRect) THEN 4titleTab.Draw; ,IF NOT SELF.suppressDrawingManipulee THEN 0IF SELF.manipulee <> NIL THEN 4SELF.manipulee.Draw; ,PenNormal; ,IF SELF.IsDraggable AND SELF.shouldFrame THEN ,FrameLRect(SELF.extentLRect); {draw overall box} ,END; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.FreeManipulee; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (Free(SELF.manipulee); (SELF.manipulee := NIL; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.Highlight(highTransit: THighTransit); $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (IF (SELF.titleTab <> NIL) THEN ,BEGIN ,InvrtLRect(SELF.titleTab.extentLRect); ,PenNormal; ,FrameLRect(SELF.titleTab.extentLRect); ,END; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.MousePress(mouseLPT: LPoint); (VAR layoutBox: TLayoutBox; ,s: TListScanner; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.children <> NIL THEN ,BEGIN ,s := SELF.children.Scanner; ,WHILE s.Scan(layoutBox) DO 0IF layoutBox.DownAt(mouseLPt) <> NIL THEN 4s.Done; ,END; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.Move(deltaLPt: LPoint); $VAR oldLRect: LRect; (newLRect: LRect; (heading: THeading; ,PROCEDURE InvalOnThePad; ,BEGIN 0thePad.InvalLRect(oldLRect); 0thePad.InvalLRect(newLRect); ,END; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (oldLRect := SELF.extentLRect; (SELF.OffsetBy(deltaLPt); (newLRect := SELF.extentLRect; (SELF.view.panel.OnAllPadsDo(InvalOnThePad); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgDbg} $FUNCTION TLayoutBox.NoTitleTab(heap: THeap): TTitleTab; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (NoTitleTab := TTitleTab.CREATE(NIL, heap, SELF, 0, noID); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TLayoutBox.OffsetBy(deltaLPt: LPoint); $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (IF SELF.manipulee <> NIL THEN ,SELF.manipulee.OffsetBy(deltaLPt); {offset MY manipulee, but not my children's, since my Rmy manipulee's OffsetBy will have done that already} (SELF.OffsetLayoutBoxBy(deltaLPt, TRUE); ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.OffsetLayoutBoxBy(deltaLPt: LPoint; textImageAsWell: BOOLEAN); I{does NOT offset manipulee} (PROCEDURE YouOffset(obj: TObject); ,VAR layoutBox: TLayoutBox; (BEGIN ,layoutBox := TLayoutBox(obj); ,layoutBox.OffsetLayoutBoxBy(deltaLPt, textImageAsWell); (END; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.titleTab <> NIL THEN ,SELF.titleTab.OffsetBy(deltaLPt); "{$H-} OffsetLRect(SELF.extentLRect, deltaLPt.h, deltaLPt.v); {$H+} (SELF.EachActualPart(YouOffset); {tells children} ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.RecalcExtent; (VAR s: TListScanner; ,newExtent: LRect; ,layoutBox: TLayoutBox; ,oldExtent: LRect; (PROCEDURE InvalOldAndNew; ,BEGIN ,thePad.InvalLRect(oldExtent); ,thePad.InvalLRect(newExtent); ,END; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (oldExtent := SELF.extentLRect; (newExtent := SELF.manipulee.extentLRect; (IF SELF.children <> NIL THEN ,IF SELF.children.Size > 0 THEN 0BEGIN 0newExtent := zeroLRect; 0s := SELF.children.Scanner; 0WHILE s.Scan(layoutBox) DO 4IF EmptyLRect(newExtent) THEN 8newExtent := layoutBox.extentLRect 4ELSE 8UnionLRect(newExtent, layoutBox.extentLRect, newExtent); 0END; (LRectAddBorders(newExtent, SELF.borders, newExtent); (IF NOT equalLRect(oldExtent, newExtent) THEN ,BEGIN ,SELF.Resize(newExtent); ,SELF.view.panel.OnAllPadsDo(InvalOldAndNew); ,END; (IF SELF.parent <> NIL THEN ,SELF.parent.RecalcExtent; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.Resize(newExtent: LRect); (VAR newTitleExtent: LRect; ,titleTab: TTitleTab; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (titleTab := SELF.titleTab; (IF titleTab <> NIL THEN ,BEGIN ,newTitleExtent := newExtent; ,newTitleExtent.bottom := newTitleExtent.top + 1(titleTab.extentLRect.bottom - titleTab.extentLRect.top); {i.e., preserve old height} ,titleTab.Resize(newTitleExtent); ,END; (SUPERSELF.Resize(newExtentLRect); ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLayoutBox.TabGrabbed; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLegendLayoutBox; {$S SgLayout} $FUNCTION TLegendLayoutBox.CREATE(object: TObject; heap: THeap; itsView: TView; itsLegend: TLegend ,): TLegendLayoutBox; $VAR itsTitleTab: TTitleTab; (itsExtentLRect: LRect; (myBorders: Rect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF itsLegend.wouldBeDraggable THEN ,myBorders := stdPlainBorders (ELSE ,myBorders := zeroRect; (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TLegendLayoutBox(TLayoutBox.CREATE(object, heap, itsLegend.extentLRect, noID, NIL, ,itsView, itsLegend, myBorders, FALSE, FALSE, FALSE)); (WITH SELF DO ,BEGIN ,isDraggable := itsLegend.wouldBeDraggable; ,shouldFrame := itsLegend.wouldBeDraggable; ,textDialogImage := NIL; ,wouldMakeSelection := TRUE; {client could override, somehow?} ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TLegendLayoutBox.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('textDialogImage: TTextDialogImage'); (Field(''); $END; ${$S SgLayout} ${$ENDC} $FUNCTION TLegendLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; $VAR curCursor: TCursorNumber; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (curCursor := noCursor; (IF SELF.Hit(mouseLPt) THEN ,IF SELF.titleTab.Hit(mouseLPt) THEN 0curCursor := arrowCursor ,ELSE ,IF SELF.wouldMakeSelection THEN 0curCursor := textCursor; (CursorAt := curCursor; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLegendLayoutBox.Draw; (VAR titleTab: TTitleTab; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (IF LRectIsVisible(SELF.extentLRect) THEN ,BEGIN ,IF SELF.isDraggable THEN 0SELF.titleTab.Draw; ,IF SELF.textDialogImage <> NIL THEN {+SW+} 0SELF.textDialogImage.Draw ,ELSE 0SELF.manipulee.Draw; ,PenNormal; ,IF SELF.IsDraggable AND SELF.shouldFrame THEN 0FrameLRect(SELF.extentLRect); {draw overall box} ,END; ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLegendLayoutBox.MousePress(mouseLPT: LPoint); (VAR editLegendSelection: TEditLegendSelection; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (TPlannerView(SELF.view).magnetCursor := textCursor; (LRectHaveLPt(SELF.manipulee.extentLRect, mouseLPt); (editLegendSelection := TEditLegendSelection(SELF.view.panel.selection.FreedAndReplacedBy( KTEditLegendSelection.CREATE(NIL, SELF.Heap, SELF, mouseLPT))); (editLegendSelection.textDialogImage.MousePress(mouseLPt); ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLegendLayoutBox.OffsetLayoutBoxBy(deltaLPt: LPoint; textImageAsWell: BOOLEAN); G{does NOT offset manipulee} $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SUPERSELF.OffsetLayoutBoxBy(deltaLPt, textImageAsWell); (IF NOT textImageAsWell THEN ,deltaLPt.v := 0; {don't do it vertically} (IF SELF.textDialogImage <> NIL THEN ,SELF.textDialogImage.OffsetBy(deltaLPt); ({$IFC fTrace}EP;{$ENDC} $END; $PROCEDURE TLegendLayoutBox.RecalcExtent; (VAR newExtent: LRect; ,oldExtent: LRect; ,paraImage: TParaImage; ,textDialogImage: TTextDialogImage; ,legPara: TParagraph; (PROCEDURE InvalOldAndNew; ,BEGIN ,thePad.InvalLRect(oldExtent); ,thePad.InvalLRect(newExtent); ,END; (PROCEDURE PourItBack(obj: TObject); ,VAR paragraph: TParagraph; (BEGIN ,paragraph := TParaImage(obj).paragraph; ,legPara.ReplPara(0, legPara.size, paragraph, 0, paragraph.size); (END; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (textDialogImage := SELF.textDialogImage; (IF textDialogImage <> NIL THEN ,BEGIN ,paraImage := TParaImage(textDialogImage.textImage.imageList.First); ,legPara := TLegend(SELF.manipulee).paragraph; ,textDialogImage.textImage.FilterAndDo(paraImage, PourItBack); ,END; (TLegend(SELF.manipulee).RecalcExtent; (oldExtent := SELF.extentLRect; (newExtent := SELF.manipulee.extentLRect; (LRectAddBorders(newExtent, SELF.borders, newExtent); (IF NOT equalLRect(oldExtent, newExtent) THEN ,BEGIN ,SELF.Resize(newExtent); ,SELF.view.panel.OnAllPadsDo(InvalOldAndNew); ,END; (IF SELF.parent <> NIL THEN ,SELF.parent.RecalcExtent; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TButtonLayoutBox; {$S DlgLayout} $FUNCTION TButtonLayoutBox.CREATE(object: TObject; heap: THeap; itsButton: TButton; HitsView: TView): TButtonLayoutBox; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TButtonLayoutBox(TLayoutBox.CREATE(object, heap, itsButton.extentLRect, itsButton.id, NIL, SitsView, itsButton, stdIDBorders, FALSE, TRUE, TRUE)); (SELF.nextSameSizedBox := SELF; {will be correctly set by TPlannerView.CREATE after all layout Gboxes made} (SELF.oldLegendTopLeft := itsButton.legend.extentLRect.topLeft; (SELF.AddImage(TDialogImage(itsButton.legend.LaunchLayoutBox(itsView))); ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TButtonLayoutBox.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('nextSameSizedBox: TButtonLayoutBox'); (Field('oldLegendTopLeft: LPoint'); (Field(''); $END; ${$ENDC} {$S DlgLayout} $PROCEDURE TButtonLayoutBox.ConsiderMouse(mouseLPt: LPoint; VAR madeSelection: BOOLEAN; ,VAR pickedLayoutBox: TLayoutBox); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (pickedLayoutBox := NIL; (madeSelection := FALSE; (IF SELF.Hit(mouseLPt) THEN ,BEGIN ,pickedLayoutBox := SELF; ,IF NOT LRectHasLPt(SELF.titleTab.extentLRect, mouseLPt) THEN ,{hit on interior -- hence, editing button text} 0BEGIN 0madeSelection := TRUE; 0LRectHaveLPt(TLayoutBox(SELF.children.First).extentLRect, mouseLPt); 0SELF.MousePress(mouseLPt); 0END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $FUNCTION TButtonLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF NOT SELF.Hit(mouseLPt) THEN ,CursorAt := noCursor (ELSE (IF SELF.titleTab.Hit(mouseLPt) THEN ,CursorAt := arrowCursor (ELSE ,CursorAt := textCursor; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $PROCEDURE TButtonLayoutBox.DrawJustMe; (VAR s: TListScanner; ,layoutBox: TLayoutBox; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF LRectIsVisible(SELF.extentLRect) THEN ,BEGIN ,SELF.titleTab.Draw; ,TButton(SELF.manipulee).DrawJustMe; {draws just the roundRect; my child will draw the text} ,PenNormal; ,FrameLRect(SELF.extentLRect); {draw overall box} ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TButtonLayoutBox.OffsetBy(deltaLPt: LPoint); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SUPERSELF.OffsetBy(deltaLPt); "{$H-} LPtPlusLPt(SELF.oldLegendTopLeft, deltaLPt, SELF.oldLegendTopLeft); {$H+} ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $PROCEDURE TButtonLayoutBox.RecalcExtent; (VAR nextBox: TButtonLayoutBox; ,oldLegendTopLeft: LPoint; ,newLegendTopLeft: LPoint; ,deltaLPt: LPoint; ,legendBox: TLegendLayoutBox; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (legendBox := TLegendLayoutBox(SELF.children.First); (newLegendTopLeft := legendBox.manipulee.extentLRect.topLeft; (oldLegendTopLeft := SELF.oldLegendTopLeft; (IF NOT EqualLPt(oldLegendTopLeft, newLegendTopLeft) THEN ,BEGIN ,LPtMinusLPt(newLegendTopLeft, oldLegendTopLeft, deltaLPt); ,legendBox.OffsetLayoutBoxBy(deltaLPt, TRUE); ,SELF.oldLegendTopLeft := newLegendTopLeft; ,END; (nextBox := SELF; (REPEAT ,nextBox.RecalcJustMe; ,nextBox := nextBox.nextSameSizedBox; (UNTIL ,nextBox = SELF; (IF SELF.parent <> NIL THEN ,SELF.parent.RecalcExtent; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $PROCEDURE TButtonLayoutBox.RecalcJustMe; {my manipulee's size may've changed} (VAR nextBox: TButtonLayoutBox; ,oldExtent: LRect; ,newExtent: LRect; (PROCEDURE InvalOldAndNew; ,BEGIN ,thePad.InvalLRect(oldExtent); ,thePad.InvalLRect(newExtent); ,END; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (oldExtent := SELF.extentLRect; (newExtent := SELF.manipulee.extentLRect; (LRectAddBorders(newExtent, SELF.borders, newExtent); (SELF.Resize(newExtent); (SELF.view.panel.OnAllPadsDo(InvalOldAndNew); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TTitleTab; {$S SgLayout} $FUNCTION TTitleTab.CREATE(object: TObject; heap: THeap; itsLayoutBox: TLayoutBox; itsHeight: INTEGER; (itsCaption: S255): TTitleTab; (VAR extentLRect: LRect; ,legend: TLegend; ,location: LPoint; {$IFC libraryVersion <= 20} {* * * P E P S I * * *} ,fInfo: TFInfo; {$ELSEC} {* * S P R I N G * *} ,fInfo: FontInfo; {$ENDC} ,width: INTEGER; ,newLegTopLeft: LPoint; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (WITH itsLayoutBox.extentLRect DO "{$H-} SetLRect(extentLRect, left, top, right, top + itsHeight); {$H+} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TTitleTab(TImage.CREATE(object, heap, extentLRect, itsLayoutBox.view)); (SELF.layoutBox := itsLayoutBox; (IF itsCaption <> '' THEN {need to create a TLegend object for it} ,BEGIN ,legend := TLegend.CREATE(NIL, SELF.Heap, itsCaption, SELF.view, zeroLPt, titleTypeStyle); ,WITH itsLayoutBox.extentLRect DO "{$H-} SetLPt(newLegTopLeft, (right + left - legend.extentLRect.right) DIV 2, Dtop + (SELF.view.res.v DIV 30)); "{$H+} legend.OffsetTo(newLegTopLeft); ,SELF.legend := legend; ,WITH legend.extentLRect DO 0IF right - left > SELF.extentLRect.right - SELF.extentLRect.left THEN 4SELF.shouldDrawLegend := FALSE 0ELSE 4SELF.shouldDrawLegend := TRUE; ,END (ELSE ,BEGIN ,SELF.legend := NIL; ,SELF.shouldDrawLegend := FALSE; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TTitleTab.Free; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (Free(SELF.legend); (SUPERSELF.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} {$S DlgDbg} $PROCEDURE TTitleTab.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('layoutBox: TLayoutBox'); (Field('legend: TLegend'); (Field('shouldDrawLegend: BOOLEAN'); (Field(''); $END; ${$S SgLayout} ${$ENDC} {$S SgLayout} $PROCEDURE TTitleTab.Draw; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (PenNormal; (FillLRect(SELF.extentLRect, lPatWhite); (FrameLRect(SELF.extentLRect); (IF SELF.shouldDrawLegend THEN {it exists and is small enough to fit} ,SELF.legend.Draw; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TTitleTab.OffsetBy(deltaLPt: LPoint); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.legend <> NIL THEN ,SELF.legend.OffsetBy(deltaLPt); (SUPERSELF.OffsetBy(deltaLPt); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TTitleTab.Resize{(newExtent: LRect)}; (VAR myCaption: S255; {$IFC libraryVersion <= 20} {* * * P E P S I * * *} ,fInfo: TFInfo; {$ELSEC} {* * S P R I N G * *} ,fInfo: FontInfo; {$ENDC} ,strLocation: LPoint; ,captionWidth: INTEGER; ,deltaLPt: LPoint; ,typeStyle: TTypeStyle; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} {this does the wrong thing for high view resolutions; must fix} (IF SELF.legend <> NIL THEN ,BEGIN ,SELF.legend.GetString(myCaption); ,SELF.legend.paragraph.StyleAt(0, typeStyle); ,SetQDTypeStyle(typeStyle); ,GetFontInfo(fInfo); ,captionWidth := StringWidth(myCaption); ${$H-} WITH newExtentLRect, fInfo DO 0SetLPt(strLocation, ((left + right - captionWidth) DIV 2), strLocation.v - SELF.legend.location.v); ,SELF.legend.OffsetBy(deltaLPt); {do more cleverly -- maybe TLegend.OffsetTo} ,WITH SELF.legend.extentLRect DO 0IF right - left > newExtent.right - newExtent.left THEN 4SELF.shouldDrawLegend := FALSE 0ELSE 4SELF.shouldDrawLegend := TRUE; ,END; (SELF.extentLRect := newExtentLRect; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLayPickSelection; {$S SgLayout} $FUNCTION TLayPickSelection.CREATE(object: TObject; heap: THeap; itsView: TPlannerView; itsKind: INTEGER; 5itsLayoutBox: TLayoutBox; itsAnchorLPt: LPoint): TLayPickSelection; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TLayPickSelection(TSelection.CREATE(object, heap, itsView, itsKind, itsAnchorLPt)); (SELF.layoutBox := itsLayoutBox; (SELF.boundLRect := itsLayoutBox.extentLRect; (itsView.currentLayoutBox := itsLayoutBox; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} {$S DlgDbg} $PROCEDURE TLayPickSelection.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('layoutBox: TLayoutBox'); (Field(''); $END; ${$S SgLayout} ${$ENDC} {$S SgLayout} $FUNCTION TLayPickSelection.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (CASE cmdNumber OF ,uClear: 0CanDoCommand := TRUE; ,OTHERWISE 0CanDoCommand := SUPERSELF.CanDoCommand(cmdNumber, checkIt); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TLayPickSelection.Deselect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (TPlannerView(SELF.view).currentLayoutBox := NIL; (SELF.layoutBox.ChangeDragState(FALSE); (SUPERSELF.Deselect; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TLayPickSelection.Highlight(highTransit: THighTransit); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.layoutBox.Highlight(highTransit); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TLayPickSelection.MouseMove(mouseLPt: LPoint); (VAR diffLPt: LPoint; ,diffLRect: LRect; $BEGIN '{$IFC fTrace}BP(11);{$ENDC} +{How far did mouse move?} ,LPtMinusLPt(mouseLPt, SELF.currLPt, diffLPt); +{Don't move past view boundaries} ,LRectMinusLRect(SELF.view.extentLRect, SELF.layoutBox.extentLRect, diffLRect); ,LRectHaveLPt(diffLRect, diffLPt); +{Move it if delta is nonzero} ,IF NOT EqualLPt(diffLPt, zeroLPt) THEN 0BEGIN *{$H-} OffsetLRect(SELF.boundLRect, diffLPt.h, diffLPt.v); {$H+} {probably discard} 0LPtPlusLPt(SELF.currLPt, diffLPt, mouseLPt); 0SELF.currLPt := mouseLPt; 0SELF.layoutBox.Move(diffLPt); 0END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TLayPickSelection.MouseRelease; $VAR deltaLPt: LPoint; (noSelection: TSelection; (manipulee: TImage; (parent: TDialogImage; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF NOT EqualLPt(SELF.currLPt, SELF.anchorLPt) THEN ,BEGIN ,LPtMinusLPt(SELF.currLPt, SELF.anchorLPt, deltaLPt); ,SELF.window.PerformCommand(TLayMoveCmd.CREATE(NIL, SELF.Heap,  NIL THEN ,manipulee.RecalcExtent; {will send it up the line to its parents} (parent := SELF.layoutBox.parent; (IF parent <> NIL THEN {now send it up the line to my own parents} ,IF InClass(parent, TLayoutBox) THEN 0parent.RecalcExtent; (IF NOT TPlannerView(SELF.layoutBox.view).retainPickedBox THEN ,SELF.Deselect; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TLayPickSelection.Restore; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (TPlannerView(SELF.view).currentLayoutBox := SELF.layoutBox; (SUPERSELF.Restore; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLayMoveCmd; {$S SgLayout} $FUNCTION TLayMoveCmd.CREATE{(object: TObject; heap: THeap; itsLayoutBox: TLayoutBox; DitsHOffset, itsVOffset: LONGINT): TLayMoveCmd}; (VAR retainPickedBox: BOOLEAN; ,cmdPhase: TCmdPhase; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TLayMoveCmd(TCommand.CREATE(object, heap, uMoveLayoutBoxes, itsLayoutBox.view, 4TRUE, revealSome)); (WITH SELF DO ,BEGIN ,layoutBox := itsLayoutbox; ,hOffset := itsHOffset; ,vOffset := itsVOffset; ,retainPickedBox := TPlannerView(itsLayoutBox.view).retainPickedBox; ,WITH SELF DO 0BEGIN 0unHiliteBefore[doPhase] := FALSE; 0hiliteAfter[doPhase] := FALSE; 0END; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} {$S DlgDbg} $PROCEDURE TLayMoveCmd.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('layoutBox: TLayoutBox'); (Field('hOffset: LONGINT'); (Field('vOffset: LONGINT'); (Field(''); $END; ${$ENDC} {$S SgLayout} $PROCEDURE TLayMoveCmd.Perform(cmdPhase: TCmdPhase); (VAR plannerView: TPlannerView; ,panel: TPanel; ,diffLPt: LPoint; $BEGIN ({$IFC fTrace}BP(12);{$ENDC} (IF cmdPhase <> doPhase THEN ,BEGIN ,WITH SELF DO {$H-} 0CASE cmdPhase OF 4redoPhase: 8SetLPt(diffLPt, hOffset, vOffset); 4undoPhase: 8SetLPt(diffLPt, -hOffset, -vOffset); 4END; {$H+} ,SELF.layoutBox.Move(diffLPt); ,SELF.layoutBox.manipulee.RecalcExtent; ,SELF.layoutBox.RecalcExtent; ,IF NOT TPlannerView(SELF.layoutBox.view).retainPickedBox THEN 0SELF.layoutBox.view.panel.selection.Deselect; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TEditLegendSelection; {$S SgLayout} $FUNCTION TEditLegendSelection.CREATE(object: TObject; heap: THeap; itsLegendLayoutBox: 0TLegendLayoutBox; itsAnchorLPt: LPoint): TEditLegendSelection; (VAR coSelection: TSelection; ,paragraph: TParagraph; ,paraImage: TParaImage; ,hostLegend: TLegend; ,textDialogImage: TTextDialogImage; ,textImage: TTextImage; ,textExtent: LRect; ,typeStyle: TTypeStyle; ,hostParagraph: TParagraph; ,PROCEDURE FindBiggestFont(VAR biggestTypeStyle: TTypeStyle); ,VAR styleChange: TStyleChange; {$IFC libraryVersion <= 20} {* * * P E P S I * * *} 0fInfo: TFInfo; {$ELSEC} {* * S P R I N G * *} 0fInfo: FontInfo; {$ENDC} 0i: INTEGER; 0oldTallest: INTEGER; ,BEGIN 0oldTallest := 0; 0FOR i := 1 TO hostParagraph.typeStyles.size - 1 DO 4BEGIN 4hostParagraph.typeStyles.GetAt(i, @styleChange); 4hostParagraph.SetTypeStyle(styleChange.newStyle); 4GetFontInfo(fInfo); 4WITH fInfo DO 8IF oldTallest < ascent + descent + leading THEN  NIL THEN ,SELF.boundLRect := itsLegendLayoutBox.parent.extentLRect (ELSE ,SELF.boundLRect := itsLegendLayoutBox.extentLRect; (SELF.legendLayoutBox := itsLegendLayoutBox; (hostLegend := TLegend(itsLegendLayoutBox.manipulee); (SELF.hostLegend := hostLegend; (hostParagraph := hostLegend.paragraph; (SELF.suppressHost := itsLegendLayoutBox.suppressDrawingManipulee; (coSelection := SELF.panel.view.NoSelection; {put non-NIL coSelection} (SELF.coSelection := coSelection; (hostLegend.paragraph.StyleAt(0, typeStyle); {use paragraph's default if none else} (FindBiggestFont(typeStyle); (SetParaExtent(hostLegend.paragraph, SELF.view, hostLegend.location, textExtent); (textExtent.right := textExtent.left + 10 * SELF.view.res.h; {ten inches wide} (textDialogImage := TTextDialogImage.CREATE(NIL, heap, textExtent, noID, SELF.view, ,typeStyle, ''); {start off with an empty guy} (SELF.textDialogImage := textDialogImage; (textImage := textDialogImage.textImage; (paraImage := TParaImage(textImage.imageList.First); (paragraph := paraImage.paragraph; (paragraph.ReplPara(0, ,paragraph.size, hostLegend.paragraph, 0, hostLegend.paragraph.size); (paraImage.changed := TRUE; (paraImage.InvalLinesWith(0, MAXINT); (textImage.RecomputeImages(actionNone, TRUE); (itsLegendLayoutBox.textDialogImage := textDialogImage; (SELF.textDialogImage := textDialogImage; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $FUNCTION TEditLegendSelection.Clone(heap: THeap): TObject; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.textDialogImage.ChangeRefCountBy(1); (Clone := TEditLegendSelection(SUPERSELF.Clone(heap)); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.Deselect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.legendLayoutBox.textDialogImage := NIL; {+SW+} (SUPERSELF.Deselect; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.Free; (VAR textDialogImage: TTextDialogImage; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (textDialogImage := SELF.textDialogImage; {+SW+} {five lines out} (SUPERSELF.Free; (textDialogImage.ChangeRefCountBy(-1); ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TEditLegendSelection.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('legendLayoutBox: TLegendLayoutBox'); (Field('hostLegend: TLegend'); (Field('textDialogImage: TTextDialogImage'); (Field('suppressHost: BOOLEAN'); (Field('tripleClick: BOOLEAN'); {+SW+} (Field(''); $END; ${$ENDC} {$S SgLayout} $FUNCTION TEditLegendSelection.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (CASE cmdNumber OF ,uModern, uClassic,u20Pitch, u15Pitch, u12Pitch, u10Pitch, u12Point, u14Point, u18Point, u24Point, ,uPlain, uBold, uItalic, uUnderline, uShadow, uOutline: 0IF SELF.hostLegend.usesSysFont THEN 4CanDoCommand := FALSE 0ELSE 4CanDoCommand := SUPERSELF.CanDoCommand(cmdNumber, checkIt); ,OTHERWISE 0CanDoCommand := SUPERSELF.CanDoCommand(cmdNumber, checkIt); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.KeyBack(fWord: BOOLEAN); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.coSelection.KeyBack(fWord); (SELF.legendLayoutBox.RecalcExtent; {will determine current width of the textDialogImage and Gadjust layout box + parents accordingly} ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.KeyChar(ch: CHAR); (VAR newExtent: LRect; ,width: INTEGER; ,paragraph: TParagraph; ,i: INTEGER; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (paragraph := TParaImage(SELF.textDialogImage.textImage.imageList.First).paragraph; (IF (paragraph.size < 255) OR 0(NOT InClass(SELF.coSelection, TInsertionPoint)) THEN {can accept more} ,BEGIN ,SELF.coSelection.KeyChar(ch); ,SELF.legendLayoutBox.RecalcExtent; {will determine current width of the textDialogImage and Kadjust layout box + parents accordingly} ,END (ELSE ,BEGIN ,process.ArgAlert(1, '255'); ,process.Stop(phTooManyChars); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.KeyEnter(dh, dv: INTEGER); $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF (dh <> 0) OR (dv <> 0) THEN ,SELF.KeyTab((dh < 0) OR (dv < 0)); {right and down keys are Forward} ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.KeyReturn; (VAR selection: TSelection; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.Deselect; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.MousePress(mouseLPT: LPoint); {+SW+} (VAR selection: TSelection; ,textImage: TTextImage; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF clickState.clickCount < 3 THEN ,SUPERSELF.MousePress(mouseLPt) (ELSE {triple click; force SelectAll} ,BEGIN ,SELF.tripleClick := TRUE; ,textImage := SELF.textDialogImage.textImage; ,SELF.Highlight(hOnToOff); ,SELF.coSelection.Become( 4textImage.text.SelectAll(textImage)); ,SELF.Highlight(hOffToOn); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.MouseMove(mouseLPT: LPoint); {+SW+} $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF NOT SELF.tripleClick THEN ,SUPERSELF.MouseMove(mouseLPt); ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.MouseRelease; {+SW+} $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF SELF.tripleClick THEN ,SELF.tripleClick := FALSE (ELSE ,SUPERSELF.MouseRelease; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.PerformCommand(command: TCommand; cmdPhase: TCmdPhase); (VAR paragraph: TParagraph; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SUPERSELF.PerformCommand(command, cmdPhase); (IF SELF.hostLegend.usesSysFont THEN ,BEGIN ,paragraph := TParaImage(SELF.textDialogImage.textImage.imageList.First).paragraph; ,paragraph.NewStyle(0, paragraph.Size, sysTypeStyle); ,END; (SELF.legendLayoutBox.RecalcExtent; {will determine current width of the textDialogImage and Gadjust layout box + parents accordingly} ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.Restore; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.legendLayoutBox.textDialogImage := SELF.textDialogImage; (SUPERSELF.Restore; ({$IFC fTrace}EP;{$ENDC} $END; {$S SgLayout} $PROCEDURE TEditLegendSelection.Reveal(asMuchAsPossible: BOOLEAN); (TYPE TXLRect = PACKED ARRAY [1..SIZEOF(LRect)] OF CHAR; (VAR lr: LRect; ,hMin: INTEGER; ,vMin: INTEGER; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (SELF.coselection.boundLRect := SELF.boundLRect; (SUPERSELF.Reveal(asMuchAsPossible); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TDialogDesignWindow; {$S DlgAlloc} $FUNCTION TDialogDesignWindow.CREATE(object: TObject; heap: THeap; 0itsHostDialogView: TDialogView): TDialogDesignWindow; (VAR fromBox: BOOLEAN; ,window: TWindow; ,htLPt: LPoint; ,height: INTEGER; ,htPt: Point; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (window := itsHostDialogView.panel.window; (fromBox := InClass(window, TDialogBox); (IF fromBox THEN ,height := window.outerRect.bottom - window.outerRect.top + 15 (ELSE ,BEGIN ,WITH itsHostDialogView.extentLRect DO &{$H-} SetLPt(htLPt, 0, bottom - top); {$H+} ,itsHostDialogView.screenPad.LPtToPt(htLPt, htPt); ,height := MIN(htPt.v + 15, screenBits.bounds.bottom - 30); ,END; (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TDialogDesignWindow(TDialogWindow.CREATE(object, heap, TRUE, height, YdiAccept, diAccept, diRefuse)); (WITH SELF DO ,BEGIN ,hostWindow := window; ,hostDialogView := itsHostDialogView; ,fromDialogBox := fromBox; ,END; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TDialogDesignWindow.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('hostWindow: TWindow'); (Field('hostDialogView: TDialogView'); (Field('fromDialogBox: BOOLEAN'); (Field(''); $END; #{$ENDC} {$S DlgLayout} $FUNCTION TDialogDesignWindow.CanDoCommand(cmdNumber: TCmdNumber; VAR checkIt: BOOLEAN): BOOLEAN; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (CASE cmdNumber OF ,uEditDialog: 0CanDoCommand := FALSE; {override SUPERSELF} ,uStopEditDialog: 0CanDoCommand := TRUE; ,OTHERWISE 0CanDoCommand := SUPERSELF.CanDoCommand(cmdNumber, checkIt); ,END; ({$IFC fTrace}EP;{$ENDC} %END; {$S DlgLayout} $FUNCTION TDialogDesignWindow.NewCommand(cmdNumber: TCmdNumber): TCommand; $BEGIN ({$IFC fTrace}BP(12);{$ENDC} (CASE cmdNumber OF ,uStopEditDialog: 0BEGIN 0SELF.RelinquishControl; 0NewCommand := NIL; 0END; ,OTHERWISE 0NewCommand := SUPERSELF.NewCommand(cmdNumber); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgLayout} $PROCEDURE TDialogDesignWindow.RelinquishControl; 0{not yet: install in resourceFile} (VAR panel: TPanel; ,plannerView: TPlannerView; ,dialogWindow: TDialogWindow; ,newHeight: INTEGER; ,noSelection: TSelection; ,newBotRight: point; %BEGIN ({$IFC fTrace}BP(11);{$ENDC} (panel := SELF.selectPanel; (panel.selection.Deselect; {should incorporate last text edit, if any} (panel.window.CommitLast; (panel.BeginSelection; {previous didn't really quite do it yet} (currentWindow.TakeDownDialogBox; {take down layout dialog} (IF SELF.fromDialogBox THEN {editing a dialog box--copy the resizing back to the dialog Window} ,BEGIN ,plannerView := TPlannerView(panel.currentView); ,newHeight := panel.innerRect.bottom; ,dialogWindow := TDialogWindow(plannerView.viewBeingPlanned.panel.window); ,SetPt(newBotRight, screenBits.bounds.right, newHeight); {transfer its current...} ,currentWindow.PutUpDialogBox(dialogWindow); ,dialogWindow.ResizeTo(newBotRight); {height to main dialog} ,IF dialogWindow.selectPanel.selection.kind <> nothingKind THEN 0currentWindow.selectWindow := dialogWindow; {=} ,END; (SELF.selectPanel.view := NIL; {kludge to avoid clobbering the main view} (currentWindow.Focus; {necessary to avoid a later popFocus trying to focus our now departed  NIL THEN ,TPageDesignWindow(SELF.layoutDialogBox).layoutPanel.view.Resize(SELF.pageView.extentLRect); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLegendHeading; {$S DlgAlloc} $FUNCTION TLegendHeading.CREATE(object: TObject; heap: THeap; itsPrintManager: TPrintManager; 5itsString: S255; itsTypeStyle: TTypeStyle; 5itsPageAlignment: TPageAlignment; itsOffsetFromAlignment: LPoint; 5itsBorders: Rect): TLegendHeading; (VAR newMaster: TLegend; ,newCurrent: TLegend; ,extent: LRect; ,view: TView; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (view := itsPrintManager.pageView; (SetLRect(extent, 0, 0, 100, 100); {meaningless at this point} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TLegendHeading(THeading.CREATE(object, heap, itsPrintManager, extent, itsPageAlignment, OitsOffsetFromAlignment)); (newMaster:= TLegend.CREATE(NIL, heap, itsString, view, zeroLPt, itsTypeStyle); (newCurrent := TLegend.CREATE(NIL, heap, itsString, view, zeroLPt, itsTypeStyle); (newMaster.HaveView(view); (newCurrent.HaveView(view); (SetParaExtent(newMaster.paragraph, view, zeroLPt, extent); (WITH SELF DO ,BEGIN ,masterLegend := newMaster; ,currentLegend := newCurrent; ,borders := itsBorders; ,minPage := 1; {readjusts from std 2, for demo purposes} ,topToBaseline := - itsBorders.top - extent.top; {both tops are negative} ,END; (newMaster.wouldBeDraggable := FALSE; (newCurrent.wouldBeDraggable := FALSE; (SELF.RecalcExtent; ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TLegendHeading.Free; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (Free(SELF.masterLegend); (Free(SELF.currentLegend); (SUPERSELF.Free; ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TLegendHeading.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('masterLegend: TLegend'); (Field('currentLegend: TLegend'); (Field('topToBaseline: INTEGER'); (Field('borders: Rect'); (Field(''); $END; ${$ENDC} {$S DlgRes} $PROCEDURE TLegendHeading.AdjustForPage(pageNumber: LONGINT; editing: BOOLEAN); (VAR currS255: S255; ,aVariable: S255; ,leftBracePos: INTEGER; ,rightBracePos: INTEGER; ,newValue: S255; ,restOfString: S255; ,newExtent: LRect; ,currentParagraph: TParagraph; ,masterParagraph: TParagraph; ,substituted: BOOLEAN; ,lastPosition: INTEGER; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (substituted := FALSE; {still flawed} (lastPosition := 0; (SELF.masterLegend.GetString(currS255); (currentParagraph := SELF.currentLegend.paragraph; (masterParagraph := SELF.masterLegend.paragraph; (currentParagraph.ReplPara(0, currentParagraph.size, masterParagraph, 0, ,masterParagraph.size); {download entire master into current} (IF NOT editing THEN ,BEGIN ,REPEAT ,leftBracePos := POS('{', currS255); ,IF leftBracePos > 0 THEN 0IF leftBracePos < lastPosition THEN {was within the previous variable} 4currS255[leftBracePos] := '$' {... so we won't get it next time} 0ELSE 4BEGIN 4restOfString := COPY(currS255, leftBracePos + 1, LENGTH(currS255) - leftBracePos); 4rightBracePos := POS('}', restOfString); 4IF rightBracePos > 0 THEN 8BEGIN 8aVariable := COPY(restOfString, 1, rightBracePos - 1); 8SELF.printManager.view.SetFunctionValue(aVariable, newValue); 8substituted := TRUE; 8currentParagraph.ReplPString(leftBracePos - 1, rightBracePos + 1, <@newValue); 8DELETE(currS255, leftBracePos, rightBracePos + 1); {get rid of the var code} 8INSERT(newValue, currS255, leftBracePos); {substitute the variable's value} 8currS255[leftBracePos] := '$'; 8lastPosition := leftBracePos + LENGTH(newValue); 8END 4ELSE 8lastPosition := LENGTH(currS255) + 1; 4END; ,UNTIL 0leftBracePos = 0; ,END {not editing} (ELSE {editing} ,SELF.masterLegend.GetBoxRight; (SELF.RecalcExtent; {tells currentLegend to get box right, then adds in my borders} '{we only need worry about our extentLRect, our location, and our current legend all )being in synch; THeading.LocateOnPage will then find the exact page location, )taking into account my offsetFromAlignment} ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgRes} $PROCEDURE TLegendHeading.Draw; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (IF SELF.ShouldFrame THEN ,FrameLRect(SELF.extentLRect); (SELF.currentLegend.Draw; ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $FUNCTION TLegendHeading.LaunchLayoutBox(view: TView): TImage; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (LaunchLayoutBox := TLgHdngLayoutBox.CREATE(NIL, SELF.Heap, view, SELF); ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TLegendHeading.OffsetBy(deltaLPt: LPoint); $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (SELF.currentLegend.OffsetBy(deltaLPt); (SUPERSELF.OffsetBy(deltaLPt); ({$IFC fTrace}EP;{$ENDC} $END; {$S TK2Start} $PROCEDURE TLegendHeading.RecalcExtent; (VAR newExtent: LRect; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (SELF.currentLegend.GetBoxRight; (LRectAddBorders(SELF.currentLegend.extentLRect, SELF.borders, newExtent); (SELF.Resize(newExtent); ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgRes} $FUNCTION TLegendHeading.ShouldFrame; $BEGIN ({$IFC fTrace}BP(9);{$ENDC} (ShouldFrame := FALSE; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TPageDesignWindow; {$S DlgAlloc} $FUNCTION TPageDesignWindow.CREATE(object: TObject; heap: THeap; itsHostView: TView): TPageDesignWindow; (CONST cPgWindowHeight = 340; 0cPgControlHeight = 130; {height of the control (status) panel} 0cHtStatusView = 220; (VAR controlPanel: TPanel; ,layoutPanel: TPanel; ,hdngDialog: THeadingDialog; ,plannerView: TPlannerView; ,dialogView: TDialogView; ,extentLRect: LRect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TPageDesignWindow(TDialogWindow.CREATE(object, heap, TRUE, cPgWindowHeight, diAccept, WdiAccept, diRefuse)); (SELF.hostView := itsHostView; (layoutPanel := TPanel.CREATE(NIL, heap, SELF, 0, 0, [aScroll, aSplit], [aScroll, aSplit]); (plannerView := TPagePlannerView.CREATE(NIL, heap, itsHostView.printManager, layoutPanel); (SELF.layoutPanel := layoutPanel; (controlPanel := layoutPanel.Divide(v, cPgControlHeight, pixelsFromEdge, 0[userCanResizeIt], 10 {min size}, [aScroll], [aScroll]); {+SW+} (SELF.controlPanel := controlPanel; (SetLRect(extentLRect, 0, 0, screenBits.bounds.right, cHtStatusView); (dialogView := TDialogView.CREATE(NIL, heap, extentLRect, controlPanel, NIL, screenRes); (dialogView.scrollPastEnd := zeroPt; {+SW+} (dialogView.AddDialog(TPageStatusDialog.CREATE(NIL, heap, dialogView.panel)); ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} $PROCEDURE TPageDesignWindow.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('hostView: TView'); (Field('layoutPanel: TPanel'); (Field(''); $END; #{$ENDC} $PROCEDURE TPageDesignWindow.Disappear; (VAR panel: TPanel; %BEGIN ({$IFC fTrace}BP(11);{$ENDC} (panel := TPagePlannerView(SELF.layoutPanel.view).viewBeingPlanned.panel; (IF panel.previewMode = mPrvwMargins THEN {make sure headings are updated} ,panel.Invalidate; (SUPERSELF.Disappear; ({$IFC fTrace}EP;{$ENDC} %END; {$S HdgMarg} $FUNCTION TPageDesignWindow.NewCommand(cmdNumber: TCmdNumber): TCommand; ${unusually, uClear is armed by TLayPickSelection.NewCommand but dealt with by the PageDesignWindow} (VAR s: TListScanner; ,layoutBox: TLayoutBox; ,plannerView: TPlannerView; ,noSelection: TSelection; ,command: TCommand; ,selectedBox: TLayoutBox; ,panel: TPanel; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (CASE cmdNumber OF ,uClear: {not undoable at present...} 0BEGIN 0SELF.CommitLast; {The committal might require a to-be-freed textImage} 0plannerView := TPlannerView(SELF.layoutPanel.view); 0panel := plannerView.panel; 0selectedBox := plannerView.currentLayoutBox; 0s := plannerView.rootDialogImage.children.Scanner; 0WHILE s.Scan(layoutBox) DO 4IF layoutBox = selectedBox THEN 8BEGIN 8panel.selection.Deselect; 8noSelection := panel.undoSelection.FreedAndReplacedBy(panel.view.NoSelection); 8panel.InvalLRect(layoutBox.extentLRect); 8layoutBox.FreeManipulee; {Delete heading from the printManager} 8s.Delete(TRUE); {Delete heading's layout box from the plannerView} 8s.Done; 8END; 0command := TCommand.CREATE(NIL, plannerView.Heap, uClear, plannerView, FALSE, LrevealNone); 0NewCommand := command; 0plannerView.currentLayoutBox := NIL; 0TPageStatusDialog(SELF.mainDialog).currentHeading := NIL; 0END; ,OTHERWISE 0NewCommand := SUPERSELF.NewCommand(cmdNumber); ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TPagePlannerView; {$S DlgAlloc} $FUNCTION TPagePlannerView.CREATE(object: TObject; heap: THeap; itsPrintManager: TPrintManager; HitsPanel: TPanel): TPagePlannerView; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TPagePlannerView(TPlannerView.CREATE(object, heap, itsPrintManager.pageView, itsPanel, UFALSE, TRUE)); (PushFocus; (TPane(itsPrintManager.view.panel.panes.First).Focus; {so that thePad will be set to something} (SELF.Init(itsPrintManager.headings); (PopFocus; (SELF.scrollPastEnd := zeroPt; ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TPagePlannerView.Draw; (VAR contentLRect: LRect; ,pat: Pattern; ,contentRect: Rect; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (contentLRect := SELF.viewBeingPlanned.printManager.contentLRect; {screen embellishments} (thePad.LPatToPat(marginPattern, pat); (thePad.LRectToRect(contentLRect, contentRect); (FillRect(contentRect, pat); (PenNormal; (FrameLRect(SELF.extentLRect); (FrameLRect(contentLRect); (SUPERSELF.Draw; {draw LayoutBoxes} ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TPageLayoutBox; {$S HdgMarg} $FUNCTION TPageLayoutBox.CREATE(object: TObject; heap: THeap; itsView: TView; itsHeading: THeading; 0itsResizable: BOOLEAN): TPageLayoutBox; ,VAR baseExtent: LRect; $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (baseExtent := itsHeading.extentLRect; (baseExtent.top := baseExtent.top + stdSlimTitleHeight; (IF object = NIL THEN ,object := NewObject(itsHeading.Heap, THISCLASS); (SELF := TPageLayoutBox(TLayoutBox.CREATE(object, heap, baseExtent, noID, NIL, LitsView, itsHeading, stdPlainBorders, itsResizable, LTRUE, TRUE)); ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TPageLayoutBox.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field(''); $END; ${$ENDC} {$S HdgMarg} $PROCEDURE TPageLayoutBox.FreeManipulee; (VAR s: TListScanner; ,heading: THeading; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (s := TPlannerView(SELF.view).viewBeingPlanned.view.printManager.headings.Scanner; (WHILE s.Scan(heading) DO ,IF heading = SELF.manipulee THEN 0BEGIN 0s.Delete(TRUE); 0s.Done; 0SELF.manipulee := NIL; 0END; ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TPageLayoutBox.TabGrabbed; (VAR heading: THeading; ,pageStatusDialog: TPageStatusDialog; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (heading := THeading(SELF.manipulee); (pageStatusDialog := TPageStatusDialog(TDialogView(TDialogWindow(SELF.view.panel.window ,).controlPanel.view).rootDialog.children.First); (IF heading <> pageStatusDialog.currentHeading THEN ,BEGIN ,WITH heading DO '{$H-} pageStatusDialog.SetHeadingParms(oddOnly, evenOnly, pageAlignment, minPage, maxPage); {$H+} ,pageStatusDialog.currentHeading := heading; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TLgHdngLayoutBox; {$S HdgMarg} $FUNCTION TLgHdngLayoutBox.CREATE(object: TObject; heap: THeap; itsView: TView; 0itsLegendHeading: TLegendHeading): TLgHdngLayoutBox; (VAR myExtent: LRect; ,itsTitleTab: TTitleTab; ,masterLegend: TLegend; ,legendLayoutBox: TLegendLayoutBox; {= SELF.children.First} $BEGIN ({$IFC fTrace}BP(7);{$ENDC} (itsLegendHeading.AdjustForPage(0, TRUE); (itsLegendHeading.LocateOnPage(TRUE); (masterLegend := itsLegendHeading.masterLegend; (masterLegend.location := itsLegendHeading.currentLegend.location; (masterLegend.GetBoxRight; (LRectAddBorders(masterLegend.extentLRect, itsLegendHeading.borders, myExtent); (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TLgHdngLayoutBox(TImageWithID.CREATE(object, heap, myExtent, noID, 0itsView, TRUE)); (itsTitleTab := TTitleTab.CREATE(NIL, heap, SELF, stdSlimTitleHeight, noID); (WITH SELF DO ,BEGIN ,titleTab := itsTitleTab; ,manipulee := itsLegendHeading; ,suppressDrawingManipulee := TRUE; ,wouldMakeSelection := TRUE; ,isResizable := FALSE; ,isDraggable := TRUE; ,shouldFrame := TRUE; ,borders := zeroRect; ,END; (legendLayoutBox := TLegendLayoutBox(itsLegendHeading.masterLegend.LaunchLayoutBox(itsView)); (SELF.legendLayoutBox := legendLayoutBox; (SELF.AddImage(legendLayoutBox); ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TLgHdngLayoutBox.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('legendLayoutBox: TLegendLayoutBox'); (Field(''); $END; ${$ENDC} {$S HdgMarg} $FUNCTION TLgHdngLayoutBox.CursorAt(mouseLPt: LPoint): TCursorNumber; (BEGIN ,{$IFC fTrace}BP(11);{$ENDC} ,IF SELF.Hit(mouseLPt) THEN 0IF SELF.titleTab.Hit(mouseLPt) THEN 4CursorAt := arrowCursor 0ELSE 4CursorAt := textCursor ,ELSE 0CursorAt := noCursor; ,{$IFC fTrace}EP;{$ENDC} (END; {$S HdgMarg} $PROCEDURE TLgHdngLayoutBox.Draw; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF LRectIsVisible(SELF.extentLRect) THEN ,BEGIN ,SELF.titleTab.Draw; ,PenNormal; ,FrameLRect(SELF.extentLRect); {draw overall box} ,SELF.legendLayoutBox.Draw; ,END; ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TLgHdngLayoutBox.MousePress(mouseLPT: LPoint); (VAR layoutBox: TLayoutBox; ,s: TListScanner; ,editLegendSelection: TEditLegendSelection; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (LRectHaveLPt(SELF.legendLayoutBox.extentLRect, mouseLPt); (editLegendSelection := TEditLegendSelection(SELF.view.panel.selection.FreedAndReplacedBy( KTEditLegendSelection.CREATE(NIL, SELF.Heap, OSELF.legendLayoutBox, OmouseLPT))); (SELF.TabGrabbed; {get report on me right in the page status panel} (editLegendSelection.textDialogImage.MousePress(mouseLPt); ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TLgHdngLayoutBox.Move(deltaLPt: LPoint); (VAR legendHeading: TLegendHeading; $BEGIN ({$IFC fTrace}BP(10);{$ENDC} (SUPERSELF.Move(deltaLPt); {offsets and invalidates} (legendHeading := TLegendHeading(SELF.manipulee); (legendHeading.masterLegend.OffsetBy(deltaLPt); "{$H-} LPtPlusLPt(legendHeading.offsetFromAlignment, deltaLPt, legendHeading.offsetFromAlignment); {$H+} ${$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TLgHdngLayoutBox.RecalcExtent; (VAR newExtent: LRect; ,oldExtent: LRect; ,deltaLPt: LPoint; ,newBaseLPoint: LPoint; ,borders: Rect; ,masterLegend: TLegend; ,oldTopToBaseline: LONGINT; ,newTopToBaseline: LONGINT; ,legendHeading: TLegendHeading; ,textExtent: LRect; ,alignedToTop: BOOLEAN; ,oldDescent: INTEGER; (PROCEDURE InvalOldAndNew; ,BEGIN ,thePad.InvalLRect(oldExtent); ,thePad.InvalLRect(newExtent); ,END; $BEGIN ({$IFC fTrace}BP(3);{$ENDC} (oldExtent := SELF.extentLRect; (legendHeading := TLegendHeading(SELF.manipulee); (masterLegend := legendHeading.masterLegend; (borders := legendHeading.borders; (oldTopToBaseline := legendHeading.topToBaseline; (SetParaExtent(masterLegend.paragraph, SELF.view, zeroLpt, textExtent); (newTopToBaseline := - borders.top - textExtent.top; (alignedToTop := legendHeading.pageAlignment IN [aTopLeft, aTopCenter, aTopRight]; (IF newTopToBaseline <> oldTopToBaseline THEN ,BEGIN ,IF alignedToTop THEN 0legendHeading.offsetFromAlignment.v := legendHeading.offsetFromAlignment.v + 4oldTopToBaseline - newTopToBaseline ,ELSE {bottom alignment} 0BEGIN 0WITH oldExtent DO 4oldDescent := bottom - top - oldTopToBaseline; 0legendHeading.offsetFromAlignment.v := legendHeading.offsetFromAlignment.v - 4textExtent.bottom + oldDescent; 0END; ,legendHeading.topToBaseline := newTopToBaseline; ,END; (LRectAddBorders(SELF.legendLayoutBox.extentLRect, borders, newExtent); (legendHeading.Resize(newExtent); (legendHeading.LocateOnPage(TRUE); (newExtent := legendHeading.extentLRect; (SetLPt(newBaseLPoint, newExtent.left - borders.left, newExtent.top + newTopToBaseline); (masterLegend.location := newBaseLPoint; (masterLegend.GetBoxRight; (SELF.Resize(newExtent); (LPtMinusLPt(newExtent.topLeft, oldExtent.topLeft, deltaLPt); (SELF.legendLayoutBox.OffsetLayoutBoxBy(deltaLPt, FALSE); {its manipulee already ok} (IF NOT equalLRect(oldExtent, newExtent) THEN ,SELF.view.panel.OnAllPadsDo(InvalOldAndNew); (SELF.TabGrabbed; {update page-status-dialog report panel} ({$IFC fTrace}EP;{$ENDC} $END; {$S DlgInit} END; METHODS OF TPageStatusDialog; {the status dialog in the PageDesign window} {$S DlgAlloc} $FUNCTION TPageStatusDialog.CREATE(object: TObject; heap: THeap; itsPanel: TPanel): TPageStatusDialog; (CONST {$IFC libraryVersion <= 20} ,spcAdjustment = -1; {$ELSEC} { S P R I N G } ,spcAdjustment = -1; {$ENDC} (VAR cluster: TCluster; ,aNumberString: S255; ,inputFrame: TInputFrame; ,button: TButton; ,promptLoc: LPoint; ,inputLoc: LPoint; ,borders: Rect; ,checkbox: TCheckbox; ,newImage: TDialogImage; ,typeStyle: TTypeStyle; ,labelOffset: Point; ,legend: TLegend; ,boxSpacing: INTEGER; ,itsID: S255; ,itsLocation: LPoint; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF object = NIL THEN ,object := NewObject(heap, THISCLASS); (SELF := TPageStatusDialog(TDialog.CREATE(object, heap, 'PAGE', itsPanel.view)); (SELF.currentHeading := NIL; (MakeTypeStyle(famModern, size12Pitch, [], typeStyle); (SetPt(labelOffset, 6, 0); (cluster := SELF.NewCluster(phOddEven); (checkbox := cluster.NewCheckbox(phOddOnly, stdBoxWidth - 3, stdBoxHeight - 2, ,TRUE, labelOffset, typeStyle, FALSE); (checkbox := cluster.NewAlignedCheckbox(phEvenOnly, FALSE); (checkbox := cluster.NewAlignedCheckbox(phOddOrEven, TRUE); (SELF.oddEvenCluster := cluster; (SetRect(borders, -18, -2, 18, 2); (inputFrame := SELF.NewInputFrame(phMinPage, typeStyle, stdFrmeOffset, stdInputTypeStyle, 6, -borders, FALSE, FALSE); (LIntToStr(2, @aNumberString); (inputFrame.SupplantContents(aNumberString); (SELF.minPageFrame := inputFrame; (inputFrame := SELF.NewInputFrame(phMaxPage, typeStyle, stdFrmeOffset, stdInputTypeStyle, 6, ,borders, FALSE, FALSE); (inputFrame.SupplantContents('------'); (SELF.maxPageFrame := inputFrame; (cluster := SELF.NewCluster(phAlignment); (checkbox := cluster.NewCheckbox(phTopLeft, stdBoxWidth - 3, stdBoxHeight - 2, TRUE, ,labelOffset, typeStyle, FALSE); (checkbox := cluster.NewAlignedCheckbox(phTopCenter, TRUE); (checkbox := cluster.NewAlignedCheckbox(phTopRight, FALSE); (checkbox := cluster.NewCheckbox(phBotLeft, stdBoxWidth - 3, stdBoxHeight - 2, TRUE, ,labelOffset, typeStyle, FALSE); {for second row} (checkbox := cluster.NewAlignedCheckbox(phBotCenter, FALSE); (checkbox := cluster.NewAlignedCheckbox(phBotRight, FALSE); (SELF.alignCluster := cluster; (button := SELF.NewButton(phLaunchHeading, stdButtonMetrics, NIL, NoCmdNumber); (SELF.AddOKButton(noCmdNumber); (MakeTypeStyle(famModern, size10Pitch, [bold], typeStyle); (legend := SELF.NewLegend(phPageMargins, typeStyle); (MakeTypeStyle(famModern, size12Pitch, [bold], typeStyle); (cluster := SELF.NewCluster(phUnits); (SELF.unitsCluster := cluster; (checkbox := cluster.NewCheckbox(phInches, stdBoxWidth - 3, stdBoxHeight - 2, TRUE, ,labelOffset, typeStyle, TRUE); (checkbox := cluster.NewAlignedCheckbox(phCentimeters, FALSE); (MakeTypeStyle(famModern, size15Pitch, [], typeStyle); (legend := SELF.AddStdLegend('0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50', 496, 140, typeStyle); (SELF.marginTitle := legend; (boxSpacing := stdBoxSpacing + spcAdjustment; (legend := SELF.NewLegend(phLeft, sysTypeStyle); (cluster := SELF.NewRowOfBoxes(phLeftCluster, 10, 100, stdBoxWidth, ,stdBoxHeight, boxSpacing); (cluster.selectBox(TCheckbox(cluster.ObjectWithIDNumber(103))); {make this the real thing someday} (SELF.leftCluster := cluster; (legend := SELF.NewLegend(phTop, sysTypeStyle); (cluster := SELF.NewRowOfBoxes(phTopCluster, 10, 200, stdBoxWidth, stdBoxHeight, boxSpacing); (cluster.selectBox(TCheckbox(cluster.ObjectWithIDNumber(203))); {make this the real thing someday} (SELF.topCluster := cluster; (legend := SELF.NewLegend(phRight, sysTypeStyle); (cluster := SELF.NewRowOfBoxes(phRightCluster, 10, 300, stdBoxWidth, stdBoxHeight, boxSpacing); (cluster.selectBox(TCheckbox(cluster.ObjectWithIDNumber(303))); {make this the real thing someday} (SELF.rightCluster := cluster; (legend := SELF.NewLegend(phBottom, sysTypeStyle); (cluster := SELF.NewRowOfBoxes(phBotCluster, 10, 400, stdBoxWidth, stdBoxHeight, boxSpacing); (cluster.selectBox(TCheckbox(cluster.ObjectWithIDNumber(403))); {make this the real thing someday} (SELF.bottomCluster := cluster; (button := SELF.NewButton(phInstallMargins, stdButtonMetrics, NIL, noCmdNumber); (SELF.extentLRect.topLeft := zeroLPt; {+SW+} ({$IFC fTrace}EP;{$ENDC} $END; ${$IFC fDebugMethods} ${$S DlgDbg} $PROCEDURE TPageStatusDialog.Fields(PROCEDURE Field(nameAndType: S255)); $BEGIN (SUPERSELF.Fields(Field); (Field('currentHeading: THeading'); (Field('oddEvenCluster: TCluster'); (Field('minPageFrame: TInputFrame'); (Field('maxPageFrame: TInputFrame'); (Field('alignCluster: TCluster'); (Field('unitsCluster: TCluster'); (Field('marginTitle: TLegend'); (Field('leftCluster: TCluster'); (Field('topCluster: TCluster'); (Field('rightCluster: TCluster'); (Field('bottomCluster: TCluster'); (Field(''); $END; ${$ENDC} {$S HdgMarg} $PROCEDURE TPageStatusDialog.ButtonPushed(button: TButton); (VAR heading: THeading; ,cluster: TCluster; ,hitBoxID: INTEGER; ,theS255: S255; ,inputFrame: TInputFrame; ,minPage: LONGINT; ,maxPage: LONGINT; ,pane: TPane; ,pageDesignWindow: TPageDesignWindow; ,plannerView: TPlannerView; ,offset: LPoint; ,layoutBox: TLayoutBox; ,pageAlignment: TPageAlignment; ,checkbox: TCheckbox; ,oddOnly: BOOLEAN; ,evenOnly: BOOLEAN; ,newMargins: LRect; ,panel: TPanel; ,inches: BOOLEAN; ,plannerPanel: TPanel; ,editLegendSelection: TEditLegendSelection; ,noSelection: TSelection; (FUNCTION Margin(cluster: TCluster; baseID: INTEGER; vhs: vhSelect): INTEGER; 0VAR hitBox: TCheckbox; 4boxOrd: INTEGER; ,BEGIN ,hitBox := cluster.hiLitBox; ,IF hitBox = NIL THEN 0boxOrd := 1 ,ELSE 0boxOrd := hitBox.idNumber - baseID + 1; ,IF inches THEN 0Margin := (pageDesignWindow.hostView.res.vh[vhs] * boxOrd) DIV 4 0{because it's in quarter of inches right now} ,ELSE {operating in centimeters} 0Margin := LIntDivInt(pageDesignWindow.hostView.res.vh[vhs] * boxOrd * ORD4(100), 508); ,END; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (pageDesignWindow := TPageDesignWindow(SELF.view.panel.window); (plannerView := TPlannerView(pageDesignWindow.layoutPanel.view); (IF button.idNumber = phLaunchHeading THEN {launch a heading AND a corresponding new layout box} ,BEGIN ,offset := zeroLPt; {default in case no ...} ,cluster := SELF.alignCluster; ,IF cluster.hiLitBox = NIL THEN 0cluster.SelectBox(TCheckbox(cluster.ObjectWithIDNumber(phTopCenter))); {bulletproofing?} ,SELF.InspectHeadingParms(oddOnly, evenOnly, pageAlignment, minPage, maxPage); ,CASE pageAlignment OF 0aTopLeft: SetLPt(offset, 80, 30); 0aTopCenter: SetLPt(offset, 0, 30); 0aTopRight: SetLPt(offset, -80, 30); 0aBottomLeft: SetLPt(offset, 80, -30); 0aBottomCenter: SetLPt(offset, 0, -30); 0aBottomRight: SetLPt(offset, -80, -30); 0END; {CASE} ,IF minPage = maxPage THEN 0IF odd(minPage) THEN 4evenOnly := FALSE 0ELSE 4oddOnly := FALSE; {keep user from launching a nowhere-printable heading} ,heading := TLegendHeading.CREATE(NIL, SELF.Heap, pageDesignWindow.hostView.printManager, 0dfltNewHeading, stdHdngTypeStyle, pageAlignment, offset, stdHdngBorders); ,heading.minPage := minPage; ,heading.maxPage := maxPage; ,heading.oddOnly := oddOnly; ,heading.evenOnly := evenOnly; ,PushFocus; ,TPane(SELF.view.panel.panes.First).Focus; {so that thePad will be set to something} ,pageDesignWindow.hostView.printManager.headings.InsLast(heading); ,heading.AdjustForPage(0, TRUE); ,heading.LocateOnPage(TRUE); ,SELF.currentHeading := heading; ,layoutBox := plannerView.NewLayoutBox(heading); ,IF layoutBox <> NIL THEN 0BEGIN 0plannerPanel := plannerView.panel; 0plannerView.rootDialog.AddImage(layoutBox); 0plannerPanel.BeginSelection; 0editLegendSelection := TEditLegendSelection(plannerPanel.selection.FreedAndReplacedBy( @TEditLegendSelection.CREATE(NIL, SELF.Heap, @TLgHdngLayoutBox(layoutBox).legendLayoutBox, zeroLPt))); 0editLegendSelection.coSelection.Become( 8editLegendSelection.textDialogImage.textImage.text.SelectAll( 8editLegendSelection.textDialogImage.textImage)); 0plannerPanel.InvalLRect(layoutBox.extentLRect); 0plannerView.currentLayoutBox := layoutBox; 0END; ,TDialogView(SELF.view).AbandonThatButton; {turn off highlighting} ,PopFocus; ,currentWindow.PerformCommand(TCommand.CREATE(NIL, SELF.Heap, uCmdLaunchHeading, plannerView, 0FALSE, revealAll)); ,END (ELSE (IF button.idNumber = phInstallMargins THEN ,BEGIN ,inches := SELF.unitsCluster.hilitBox.idNumber = phInches; ,newMargins.left := Margin(SELF.leftCluster, 100, h); ,newMargins.top := Margin(SELF.topCluster, 200, v); ,newMargins.right := Margin(SELF.rightCluster, 300, h); ,newMargins.bottom := Margin(SELF.bottomCluster, 400, v); ,pageDesignWindow.hostView.printManager.ChangeMargins(newMargins); ,TDialogView(SELF.view).AbandonThatButton; {turn off highlighting} ,plannerView.panel.InvalLRect(plannerView.extentLRect); {redraw layout panel with chgd margins} ,currentWindow.PerformCommand(TCommand.CREATE(NIL, SELF.Heap, uCmdInstallMargins, plannerView, 0FALSE, revealNone)); ,END (ELSE {ok button} ,BEGIN ,panel := plannerView.panel; ,panel.window.CommitLast; ,noSelection := panel.undoSelection.FreedAndReplacedBy(panel.view.NoSelection); ,panel.selection.Deselect; ,SUPERSELF.ButtonPushed(button); {will give OK dismissal to dialog} ,END; '{$IFC fTrace}EP;{$ENDC} #END; {$S HdgMarg} $PROCEDURE TPageStatusDialog.InspectHeadingParms(VAR oddOnly, evenOnly: BOOLEAN; 4VAR pageAlignment: TPageAlignment; VAR minPage, maxPage: LONGINT); (VAR heading: THeading; ,newPageAlignment: TPageAlignment; ,theS255: S255; ,checkbox: TCheckbox; ,cState: TConvResult; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (checkbox := SELF.oddEvenCluster.hiLitBox; (IF checkbox = NIL THEN ,BEGIN ,oddOnly := FALSE; ,evenOnly := FALSE; ,END (ELSE ,BEGIN ,oddOnly := (checkbox.idNumber = phOddOnly); ,evenOnly := (checkbox.idNumber = phEvenOnly); ,END; (checkbox := SELF.alignCluster.hiLitBox; (IF checkbox = NIL THEN ,pageAlignment := aTopCenter (ELSE (CASE checkbox.idNumber OF ,phTopLeft: pageAlignment := aTopLeft; ,phTopCenter: pageAlignment := aTopCenter; ,phTopRight: pageAlignment := aTopRight; ,phBotLeft: pageAlignment := aBottomLeft; ,phBotCenter: pageAlignment := aBottomCenter; ,phBotRight: pageAlignment := aBottomRight; ,END; (SELF.maxPageFrame.GetContents(theS255); (StrToLInt(@theS255, maxPage, cState); (IF (cState <> cvValid) OR (maxPage <= 0) THEN ,BEGIN ,maxPage := MAXLINT; ,SELF.maxPageFrame.SupplantContents('------'); ,END; (SELF.minPageFrame.GetContents(theS255); (StrToLInt(@theS255, minPage, cState); (IF (cState <> cvValid) OR (minPage > maxPage) THEN ,BEGIN ,minPage := 1; ,SELF.minPageFrame.SupplantContents('1'); ,END; '{$IFC fTrace}EP;{$ENDC} #END; {$S HdgMarg} $PROCEDURE TPageStatusDialog.SetHeadingParms(oddOnly, evenOnly: BOOLEAN; 8pageAlignment: TPageAlignment; minPage, maxPage: LONGINT); (VAR heading: THeading; ,newPageAlignment: TPageAlignment; ,theS255: S255; ,checkbox: TCheckbox; ,targetID: INTEGER; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF oddOnly THEN ,targetID := phOddOnly (ELSE (IF evenOnly THEN ,targetID := phEvenOnly (ELSE ,targetID := phOddOrEven; (SELF.oddEvenCluster.SelectBox(TCheckbox(SELF.oddEvenCluster.ObjectWithIDNumber(targetID))); (CASE pageAlignment OF ,aTopLeft: targetID := phTopLeft; ,aTopCenter: targetID := phTopCenter; ,aTopRight: targetID := phTopRight; ,aBottomLeft: targetID := phBotLeft; ,aBottomCenter: targetID := phBotCenter; ,aBottomRight: targetID := phBotRight; ,END; (SELF.alignCluster.SelectBox(TCheckbox(SELF.alignCluster.ObjectWithIDNumber(targetID))); (IntToStr(minPage, @theS255); (SELF.minPageFrame.SupplantContents(theS255); (IF maxPage = maxLInt THEN ,theS255 := '------' (ELSE ,IntToStr(maxPage, @theS255); (SELF.maxPageFrame.SupplantContents(theS255); '{$IFC fTrace}EP;{$ENDC} #END; {$S HdgMarg} $PROCEDURE TPageStatusDialog.CheckboxHit(checkbox: TCheckbox; toggleDirection: BOOLEAN); (VAR heading: THeading; ,newPageAlignment: TPageAlignment; ,newTitle: S255; ,phIndex: INTEGER; ,dummy: LPoint; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (IF checkBox.parent = SELF.unitsCluster THEN ,BEGIN ,IF checkbox.idNumber = phInches THEN 0phIndex := phInchTitle ,ELSE 0phIndex := phCmTitle; ,GetTextAndLocation(phIndex, newTitle, dummy); ,SELF.marginTitle.ChangeString(newTitle); ,END; '{$IFC fTrace}EP;{$ENDC} #END; {$S HdgMarg} $FUNCTION TPageStatusDialog.DownAt(mouseLPt: LPoint): TDialogImage; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SELF.currentHeading := NIL; (DownAt := SUPERSELF.DownAt(mouseLPt); ({$IFC fTrace}EP;{$ENDC} $END; {$S HdgMarg} $PROCEDURE TPageStatusDialog.Draw; (CONST horizLine = 100; 0vertLine = 570; $BEGIN ({$IFC fTrace}BP(11);{$ENDC} (SUPERSELF.Draw; {draw the dialog} (MoveToL(0, horizLine); (PenNormal; (PenSize(3, 2); (LineToL(SELF.view.extentLRect.right, horizLine); (MoveToL(vertLine, 0); (LineToL(vertLine, horizLine); '{$IFC fTrace}EP;{$ENDC} #END; {$S DlgInit} END; 3. "6F^9eLD!$ǐ^R\Oval(r: LRect; lPat: LPattern); PROCEDURE FrameLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE PaintLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE EraseLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE InvrtLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE FillLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER; lPat: LPattern); PROCEDURE FrameLArc(r: LRect; startAngle, arcAngle: INTEGUNIT UDraw; {Copyright 1983, 1984, Apple Computer, Inc.} {changed 05/01 1503 Changes to allow people to use Clascal on the Workshop} {$Setc IsIntrinsic := TRUE } {$IFC IsIntrinsic} INTRINSIC; {$ENDC} INTERFACE USES ${$U UnitStd } UnitStd, {Client should not USE UnitStd} ${$U UnitHz } UnitHz, {Client should not USE UnitHz and MUST NOT USE Storage} ${$U libtk/UObject} UObject, {Client must USE UObject} ${$U -#BOOT-SysCall} SysCall, {Client may USE SysCall} {$IFC LibraryVersion > 10} ${$U LIBPL/PaslibCall} PaslibCall, ${$U LIBPL/PPasLibc } PPasLibC, {$ENDC} {$IFC LibraryVersion <= 20} ${$U FontMgr } FontMgr, {Client should USE UFont instead of FontMgr before QuickDraw} {$ENDC} ${$U QuickDraw } QuickDraw, {Client must USE QuickDraw (unless we provide a type-stub for it)} {$IFC LibraryVersion > 20} ${$U FontMgr } FontMgr, {Client should USE UFont instead of FontMgr after QuickDraw} {$ENDC} ${$U WM.Events } Events, ${$U WM.Folders } Folders, ${$U FilerComm } FilerComm; {$SETC fDbgDraw := fDbgOK} {$SETC fRngDraw := fDbgOK} {$SETC fSymDraw := fSymOK} {$SETC fDebugMethods := fDbgDraw} {if VAR also true, trace entries and/or exits} CONST ${there should be at most 10 families and they should be in consecutive order; otherwise ,the command number constants in UABC should be changed} $famSystem = 0; $famMin = 1; {minimum family number that appears in the font menu} $famModern = 1; $famClassic = 2; $famMax = 2; ${there should be at most 20 families and they should be in consecutive order; otherwise ,the command number constants in UABC should be changed} $sizeMin = 1; $size20Pitch = 1; { 8 Point 20 Pitch NOTE: Modern available only} $size15Pitch = 2; { 8 Point 15 Pitch NOTE: Modern available only} $size12Pitch = 3; {10 Point 12 Pitch} $size10Pitch = 4; {12 Point 10 Pitch} $size12Point = 5; {12 Point proportional} $size14Point = 6; {14 Point proportional} $size18Point = 7; {18 Point proportional} $size24Point = 8; {24 Point proportional} $sizeMax = 8; ${font IDs to be used in QuickDraw} $fIDSystem = 0; {Reserved for application generated text, that cannot be edited by user; Ddoes not print properly} $fID20Pitch = 19; $fID15Pitch = 7; $fIDm12Pitch = 8; $fIDc12Pitch = 13; $fIDm10Pitch = 9; $fIDc10Pitch = 14; $fIDm12Point = 4; $fIDc12Point = 10; $fIDm14Point = 15; $fIDc14Point = 16; $fIDm18Point = 5; $fIDc18Point = 11; $fIDm24Point = 6; $fIDc24Point = 12; $fIDRulers = 25; {Ruler Icons} ${fontIDs below this line are to be used only in special cases, there is no guarantee that these ,will print properly} $fIDSysPatterns = 2; {System Patterns, ie. LisaDraw} $fIDSysCursors = 3; {System Cursors} $fIDLT20Graphics = 23; {LisaTerminal 20 Pitch VT100 graphics} $fIDLT12Graphics = 17; {LisaTerminal 12 Pitch VT100 graphics} $fIDLT20Text = 27; {LisaTerminal 20 Pitch VT100 text} $fIDLT12Text = 26; {LisaTerminal 12 Pitch VT100 text} $fIDDeskIcons = 22; {Desktop Icon font} $fIDWM = 1; {Window Manager font} $fIDCalculator = 18; {Calculator font} $fIDIconName = 21; {Icon Name font} $fIDMarker = 20; {Marker Font} $fIDLisaGuide = 24; {LisaGuide Font} TYPE $TFontIDArray = ARRAY[famMin..famMax, sizeMin..sizeMax] OF INTEGER; $TScaler = (RECORD {scale-definition} (numerator: point; {numerator.h DIV denominator.h is the scale factor in horiz direction} (denominator: point; {numerator.v DIV denominator.v is the scale factor in the vert. direction} (END; $TRectCoords = ARRAY[FALSE..TRUE] OF Point; {TRectCoords(aRect)[FALSE] = aRect.topLeft; [TRUE] = botRight} $LPoint = ,RECORD 0CASE INTEGER OF 40: (v, h: LONGINT); 41: (vh: ARRAY [VHSelect] OF LONGINT) ,END; $LRect = ,RECORD 0CASE INTEGER OF 40: (top, left, bottom, right: LONGINT); 41: (topLeft, botRight: LPoint) ,END; $LPattern = PACKED ARRAY[0..7] OF 0..255; $TLRectCoords = ARRAY[FALSE..TRUE] OF LPoint; {TLRectCoords(anLRect)[FALSE] = anLRect.topLeft; etc.} $TEnumActions = (rErase, rFrame, rBackground, rDraw); $TActions = SET OF TEnumActions; $THighTransit = (hNone, hOffToDim, hOffToOn, hDimToOn, hDimToOff, hOnToOff, hOnToDim); ${Refresh assumes that the last four and only the last four start with already-highlighted stuff} $TEnumResizability = (userCanResizeIt, windowCanResizeIt); $TResizability = SET OF TEnumResizability; {arg for TBranchArea.CREATE & TPanel.Divide} $TFontRecord = (PACKED RECORD (CASE BOOLEAN OF ,FALSE: (fontNum: INTEGER); ,TRUE: (fontFamily: Byte; 5fontSize: Byte) (END; $TTypeStyle = (RECORD {$IFC LibraryVersion <= 20} (onFaces: TSeteface; {$ELSEC} (onFaces: Style; {$ENDC} (font: TFontRecord; (END; $TArea = SUBCLASS OF TObject &{Variables} (innerRect: Rect; {window(usually)-relative bounds excluding borders} (outerRect: Rect; {bounding box in ancestral coordinates} (parentBranch: TBranchArea; {only used for TPanels and TBranchAreas} &{Creation/Destruction} (FUNCTION TArea.CREATE(object: TObject; heap: THeap; itsRect: Rect): TArea; ABSTRACT; &{Attributes} (FUNCTION TArea.ChildWithPt(pt: Point; childList: TList; VAR nearestPt: Point): TArea; (PROCEDURE TArea.GetBorder(VAR border: Rect); DEFAULT; @{Return the deltas of the border bars, etc. (outer=inner+border)} @{windows, bands, panes: 1 all around; Apanels: 1 on left/top, scroll bars on right/bottom} (PROCEDURE TArea.GetMinExtent(VAR minExtent: Point; windowIsResizingIt: BOOLEAN); ABSTRACT; (PROCEDURE TArea.SetOuterRect(newOuterRect: Rect); (PROCEDURE TArea.SetInnerRect(newInnerRect: Rect); &{Display} {Other methods assume grafPort, origin, & clipping were preset by Focus} (PROCEDURE TArea.Erase; @{Erase the interior} (PROCEDURE TArea.Focus; ABSTRACT; @{Set up the grafPort for this window or pad} (PROCEDURE TArea.Frame; DEFAULT; @{Draw outlines, scroll bars, etc. outside the bounding box} (PROCEDURE TArea.Refresh(rActions: TActions; highTransit: THighTransit); ABSTRACT; &{Buttoning} (FUNCTION TArea.DownAt(mousePt: Point): BOOLEAN; ABSTRACT; &{Resizing} (PROCEDURE TArea.ResizeInside(newInnerRect: Rect); ABSTRACT; (PROCEDURE TArea.ResizeOutside(newOuterRect: Rect); ABSTRACT; (END; $TPad = SUBCLASS OF TArea &{Variables} (port: GrafPtr; {the GrafPort used by this pad} (viewedLRect: LRect; {The portion of view that is displayed in innerRect} (visLRect: LRect; {viewedLRect sect visRgn while focused} (availLRect: LRect; {The larger part of view that fits in a 16-bit Rect} (scrollOffset: LPoint; {The distance scrolled from the view topLeft} (origin: Point; {What to set the grafport origin to when focused} (cdOffset: LPoint; {What to subtract from coordinates to get port coords} (clippedRect: rect; {additional clipping to apply at Focus time} (padRes: Point; {spots/inch in the pad coordinate space} (viewedRes: Point; {spots/inch in the 32-bit space being projected} (scaled: BOOLEAN; {the net scale factor, combining zooming} (scaleFactor: TScaler; {and aspect ratio, etc.} (zoomFactor: TScaler; &{Creation/Destruction} (FUNCTION TPad.CREATE(object: TObject; heap: THeap; itsInnerRect: Rect; itsViewedLRect: LRect; ;itsPadRes, itsViewRes: Point; ;itsPort: GrafPtr): TPad; (PROCEDURE TPad.Redefine(itsInnerRect: Rect; itsViewedLRect: LRect; 0 and 2LIntDivInt(i-(j DIV 2), j) if i<0} PROCEDURE PtPlusPt(operand1, operand2: Point; VAR result: Point); PROCEDURE PtMinusPt(operand1, operand2: Point; VAR result: Point); PROCEDURE PtMulInt(operand1: Point; operand2: INTEGER; VAR result: Point); PROCEDURE PtDivInt(operand1: Point; operand2: INTEGER; VAR result: Point); {$IFC LibraryVersion <= 20} FUNCTION EqualPt(operand1, operand2: Point): BOOLEAN; {Will be in QuickDraw eventually} {$ENDC} PROCEDURE RectPlusRect(operand1, operand2: Rect; VAR result: Rect); PROCEDURE RectMinusRect(operand1, operand2: Rect; VAR result: Rect); {$IFC LibraryVersion <= 20} FUNCTION EqualRect(rectA, rectB: Rect): BOOLEAN; {Will be in QuickDraw eventually} FUNCTION EmptyRect(r: Rect): BOOLEAN; {Will be in QuickDraw eventually} {$ENDC} PROCEDURE AlignRect(VAR dstRect: Rect; srcRect: Rect; vhs: VHSelect); FUNCTION LengthRect(r: Rect; vhs: VHSelect): INTEGER; FUNCTION RectHasPt(dstRect: Rect; pt: Point): BOOLEAN; PROCEDURE RectHavePt(dstRect: Rect; VAR pt: Point); {change pt so that topLeft <= pt <= botRight} FUNCTION RectsNest(outer, inner: Rect): BOOLEAN; PROCEDURE RectifyRect(VAR dstRect: Rect); {exchange coordinates until topLeft <= botRight} FUNCTION RectIsVisible(rectInPort: Rect): BOOLEAN; PROCEDURE PointToStr(pt: Point; str: TPstring); {Referenced as EXTERNAL by UABC2} PROCEDURE RectToStr(r: Rect; str: TPstring); {Referenced as EXTERNAL by UABC2} PROCEDURE LPtPlusLPt(operand1, operand2: LPoint; VAR result: LPoint); PROCEDURE LPtMinusLPt(operand1, operand2: LPoint; VAR result: LPoint); PROCEDURE LPtMulInt(operand1: LPoint; operand2: INTEGER; VAR result: LPoint); PROCEDURE LPtDivInt(operand1: LPoint; operand2: INTEGER; VAR result: LPoint); FUNCTION EqualLPt(operand1, operand2: LPoint): BOOLEAN; PROCEDURE LRectPlusLRect(operand1, operand2: LRect; VAR result: LRect); PROCEDURE LRectMinusLRect(operand1, operand2: LRect; VAR result: LRect); FUNCTION EqualLRect(rectA, rectB: LRect): BOOLEAN; FUNCTION EmptyLRect(r: LRect): BOOLEAN; PROCEDURE AlignLRect(VAR destLRect: LRect; srcLRect: LRect; vhs: VHSelect); FUNCTION LengthLRect(r: LRect; vhs: VHSelect): LONGINT; FUNCTION LRectHasLPt(destLRect: LRect; pt: LPoint): BOOLEAN; PROCEDURE LRectHaveLPt(destLRect: LRect; VAR pt: LPoint); {change pt so that topLeft <= pt <= botRight} FUNCTION LRectsNest(outer, inner: LRect): BOOLEAN; PROCEDURE RectifyLRect(VAR destLRect: LRect); {exchange coordinates until topLeft <= botRight} FUNCTION LRectIsVisible(srcLRect: LRect): BOOLEAN; PROCEDURE LPointToStr(pt: LPoint; str: TPstring); {Referenced as EXTERNAL by UOBJECT2} PROCEDURE LRectToStr(r: LRect; str: TPstring); {Referenced as EXTERNAL by UOBJECT2} PROCEDURE SetLPt(VAR destPt: LPoint; itsH, itsV: LONGINT); PROCEDURE SetLRect(VAR dstRect: LRect; itsLeft, itsTop, itsRight, itsBottom: LONGINT); PROCEDURE OffsetLRect(VAR dstRect: LRect; dh, dv: LONGINT); PROCEDURE InsetLRect(VAR dstRect: LRect; dh, dv: LONGINT); FUNCTION SectLRect(srcRectA, srcRectB: LRect; VAR dstRect: LRect): BOOLEAN; PROCEDURE UnionLRect(srcRectA, srcRectB: LRect; VAR dstRect: LRect); FUNCTION LPtInLRect(pt: LPoint; r: LRect): BOOLEAN; FUNCTION IsSmallPt(srcPt: LPoint): BOOLEAN; FUNCTION IsSmallRect(srcRect: LRect): BOOLEAN; (*PROCEDURE ClipLRect(r: LRect); {Not yet implementable}*) {Drawing text} PROCEDURE DrawLText(textBuf: Ptr; startByte, numBytes: INTEGER); {Drawing lines, rectangles, and ovals} PROCEDURE MoveToL(h, v: LONGINT); PROCEDURE MoveL(dh, dv: LONGINT); PROCEDURE LineToL(h, v: LONGINT); PROCEDURE LineL(dh, dv: LONGINT); PROCEDURE FrameLRect(r: LRect); PROCEDURE PaintLRect(r: LRect); PROCEDURE EraseLRect(r: LRect); PROCEDURE InvrtLRect(r: LRect); PROCEDURE FillLRect(r: LRect; lPat: LPattern); PROCEDURE FrameLOval(r: LRect); PROCEDURE PaintLOval(r: LRect); PROCEDURE EraseLOval(r: LRect); PROCEDURE InvrtLOval(r: LRect); PROCEDURE FillLOval(r: LRect; lPat: LPattern); PROCEDURE FrameLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE PaintLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE EraseLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE InvrtLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER); PROCEDURE FillLRRect(r: LRect; ovalWidth, ovalHeight: INTEGER; lPat: LPattern); PROCEDURE FrameLArc(r: LRect; startAngle, arcAngle: INTEGER); PROCEDURE PaintLArc(r: LRect; startAngle, arcAngle: INTEGER); PROCEDURE EraseLArc(r: LRect; startAngle, arcAngle: INTEGER); PROCEDURE InvrtLArc(r: LRect; startAngle, arcAngle: INTEGER); PROCEDURE FillLArc(r: LRect; startAngle, arcAngle: INTEGER; lPat: LPattern); FUNCTION ClonePicture(pic: PicHandle; toHeap: THeap): PicHandle; PROCEDURE ResizeFeedback(mousePt: Point; minPt, maxPt: Point; outerRect: Rect; 9tabHeight, sbWidth, sbHeight: INTEGER; VAR newPt: Point); PROCEDURE PushFocus; {Save old focusArea on focusStack} PROCEDURE PopFocus; {Restore old focusArea from focusStack and focus on it} {$IFC LibraryVersion <= 20} PROCEDURE MakeTypeStyle(itsFamily: INTEGER; itsSize: INTEGER; ,itsFaces: TSetEFace; ,VAR typeStyle: TTypeStyle); {$ELSEC} PROCEDURE MakeTypeStyle(itsFamily: INTEGER; itsSize: INTEGER; ,itsFaces: Style; ,VAR typeStyle: TTypeStyle); {$ENDC} FUNCTION QDFontNumber(typeStyle: TTypeStyle): INTEGER; PROCEDURE SetQDTypeStyle(typeStyle: TTypeStyle); IMPLEMENTATION {$I libtk/UDRAW2.TEXT} END. $$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$ O 9999 NOMPNQORPSQTRUSVT WU XV YW ZX [Y\Z][^\_]`^a_b`cadbecfdgehfigjhkiljmk nl!om"pn#qo$rp%sq&tr'us(vt)wu*xv+yw,zx-{y.|z/}{0~|1}2~3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~O       !" #!$"%#&$'%(&)'*(+),*-+.,/- 0.!1/"20#31$42%53&64'75(86)97*:8+;9,<:-=;.></?=0@>1A?2B@3CA4DB5EC6FD7GE8HF9IG:JH;KINL?OM@PNAQOBRPCSQDTREUSFVTGWUHXVIYWJZXK[YL\ZM][N^\O_]P`^Qa_Rb`ScaTdbUcfgehfigjhkiljmknl om pn qo rp sqtrusvtwuxvywzx{y|z}{~|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~           !!"" ##!$$"%%#&&$''%((&))'**(++),,*--+..,//-00.11/220331442553664775886997::8;;9<<:==;>><??=@@>AA?BB@CCADDBEECFFDGGEHHFIIGJJHKKILLJMMKNNLOOMPPNQQORRPSSQTTRUUSVVTWWUXXVYYWZZX[[Y\\Z]][^^\__]``^aa_bb`ccaddbeecffdggehhfiigjjhkkilljmmknnloomppnqqorrpssqttruusvvtwu x yw zx {y |z }{ ~| } ~                         ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I                                  ! " # $ % & ' ( ) * +