home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc™ Source Code / Layout / Facet.cpp < prev    next >
Encoding:
Text File  |  1996-08-28  |  64.3 KB  |  2,104 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Facet.cpp
  3.  
  4.     Contains:    Implementation of class ODFacet
  5.  
  6.     Owned by:    Joshua Susser
  7.  
  8.     Copyright:    © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <4>     6/27/96    TJ        1355706 js - Fixed inset display of active
  13.                                     border.
  14.          <2>     3/14/96    EL        1322489 OD Corrupts value of memory loc 18
  15.                                     because it does not check for null in
  16.                                     GetParent
  17.         <52>    10/18/95    JBS        1288922 don't force DrawActiveBorder, wait
  18.                                     for Window::Update; 1293224 use internal
  19.                                     transform in DrawActiveBorder; 1293393
  20.                                     don't invert a lone external transform
  21.         <51>    10/18/95    TJ        Accessing Link though public methods now.
  22.         <50>    10/17/95    jpa        1291724: Prevent crashes in
  23.                                     CreateEmbeddedFacet if e.g. part's
  24.                                     DisplayFrameConnected fails. 1289153:
  25.                                     Prevent corruption of FacetNode tree when
  26.                                     deleting facets.
  27.         <49>     10/8/95    TJ        Fixes Recomended by Refball
  28.         <48>     9/18/95    JBS        1278337 use kODErrCanvasHasNoOwner
  29.         <47>     9/18/95    JBS        1278337 use kODErrCanvasHasNoOwner
  30.         <46>     9/13/95    DM        1277216 GM:API return no ODPoints nor
  31.                                     ODPolygons
  32.         <45>      9/8/95    JBS        1282464 call AdjustBorderShape(NULL) in
  33.                                     ChangeActiveShape; 1283130
  34.                                     DrawActiveBorder: THROW if
  35.                                     AdjustBorderShape returns NULL
  36.         <44>     8/31/95    JBS        1278337 error code cleanup
  37.         <43>     8/29/95    JBS        1261682 allow NULL shape param for Update,
  38.                                     Draw, DrawChildren[Always]; 1265527 return
  39.                                     error if NULL owner for canvas in
  40.                                     CreateEmbeddedFacet; 1280635 fix getting
  41.                                     node of sibling facet; 1280637 problem in
  42.                                     ChangeCavas notifying parts; 1280991
  43.                                     ChangeCanvas should inval aggGeometry
  44.         <42>     8/21/95    NP        1274946:
  45.                                     kODErrInvalidCanvas->kODErrCanvasNotFound
  46.         <41>      8/7/95    JBS        1275083 move Facet inval code to Canvas
  47.         <40>      8/3/95    RR        #1257260: Collapse B classes. Remove
  48.                                     somInit methods. Don't call IsInitialized
  49.                                     or SubclassResponsibility
  50.         <39>     6/29/95    DM        1242642 BB: refcounting: acquire member
  51.                                     vars (not locals) when possible.
  52.         <38>     6/26/95    TÇ        1242642 BB:Fix refcounting bugs
  53.         <37>     6/23/95    JBS        1237891 invalidateAggregateClipShape of
  54.                                     children when internalTranformChange
  55.         <36>     6/23/95    JBS        1251627 fix refcounting throughout file
  56.         <35>     6/21/95    JBS        1259494: OK for extTform to be kODNULL
  57.         <34>     6/20/95    JBS        1257315 change AcquireWindow to GetWindow;
  58.                                     1260681 remove BaseFacet class
  59.         <33>     5/31/95    JBS        1232127 fixed typo in GetFrameTransform
  60.         <32>     5/26/95    RR        #1251403: Multithreading naming support
  61.         <31>     5/25/95    jpa        List.h --> LinkList.h [1253324]
  62.         <30>     5/17/95    JBS        1240846 fix active border updating; 1250177
  63.                                     fix ODCanvas::AcquireOwner refcounting
  64.         <29>     5/15/95    JBS        1240846 flush activeBorderShape when
  65.                                     aggregate clip shape invalidated; 1237811
  66.                                     notify part via GeometryChanged in
  67.                                     InternalTransformChanged; 1245156 implement
  68.                                     Purge
  69.         <28>     5/10/95    JBS        1214984 DrawChildren and DrawChildrenAlways
  70.                                     don't convert the invalidShape; 1224727
  71.                                     Facet hit-testing calls should take point
  72.                                     param in frame coords; 1227547 Coordinate
  73.                                     system for ODWindow::Update and
  74.                                     ODFacet::Update
  75.         <27>      5/2/95    JBS        1243371 fix some exception names
  76.         <26>     4/28/95    JBS        1242501 added top-level SOM exception
  77.                                     handling; 1234639 ContainsPoint can now
  78.                                     deal with NULL clipShape; 1243382
  79.                                     ::AcquireWindowAggregateClipShape smashes
  80.                                     ClipShape; 1229231, 1236877, 1227187 fixed
  81.                                     mem leaks in Invalidate,
  82.                                     InvalidateActiveBorder, DrawActiveBorder
  83.         <25>     4/27/95    JBS        1209506 $5 comments eliminated
  84.         <24>     4/14/95    JBS        1216535 use part's storageUnit instead of
  85.                                     frame's to get Session in RemoveFacet
  86.         <23>      3/8/95    JBS        1165158 AdjustBorderShape implementation
  87.         <22>     2/28/95    JBS        1198509 added fActiveBorderShape, moved
  88.                                     active border display code to border.cpp
  89.         <21>     1/13/95    RR        Remove MouseEnter, MouseWithin and
  90.                                     MouseLeave
  91.         <20>      1/5/95    JBS        1174640: offscreen canvas drawing broken;
  92.                                     1201572: Invalidate smashes window origin
  93.         <19>    12/20/94    jpa        Modified AcquireAggregateClipShape to set
  94.                                     geometry mode of aggregate clip shape to
  95.                                     kODLoseGeometry; should speed up clipping.
  96.                                     [1168281]
  97.         <18>    12/20/94    jpa        Use kODLoseGeometry mode for clip shapes
  98.                                     [1168281]
  99.         <17>     11/2/94    eeh        #1179885 (for JBS): stop
  100.                                     AcquireAggregateClipShape from smashing
  101.                                     clipShape.
  102.         <16>    10/18/94    JBS        1188065: change return type of DragEnter &
  103.                                     DragWithin to ODDragResult
  104.         <15>     9/29/94    JBS        1188214: more coord bias impl
  105.         <14>     9/29/94    RA        1189812: Mods for 68K build.
  106.         <13>     9/22/94    JBS        1188214: coordinate bias implementation
  107.         <12>     8/31/94    TÇ        #1183129, #1183116, #1183119, #1183111:
  108.                                     Lots of ErrorCode cleanup.
  109.         <11>     8/24/94    JBS        1181909: new active border appearance
  110.         <10>     8/18/94    jpa        Filled in imaging factories [1180387]
  111.          <9>     8/16/94    JBS        1180387: add CreateCanvas()
  112.          <8>     8/15/94    JBS        1180387: added Imaging factory methods
  113.          <7>     8/12/94    JBS        1179920: move fWindow from Facet to Frame
  114.          <6>     8/10/94    JBS        1179919: coordinate system bias changes
  115.          <5>      8/9/94    VL        1179857: DragEnter and DragWithin return
  116.                                     ODBoolean.
  117.          <4>      8/5/94    JBS        #1179151 Part API cleanup
  118.          <3>     7/17/94    TÇ        use ODDeleteObject() when deleting objects
  119.                                     in the somUninit method.
  120.          <2>      7/7/94    JBS        un-commented code
  121.          <1>     6/30/94    JBS        first checked in
  122.          <0>     6/30/94    SV        SOMverted
  123.          <7>      5/9/94    MB        #1162181: Changes necessary to install MMM.
  124.          <6>      4/6/94    JBS        1155477
  125.          <5>     3/29/94    JBS        1153059 ::ChangeCanvas() - notify parts
  126.          <4>     3/28/94    CG        1153547: Renamed XMPSessn.h to XMPSessM.h
  127.          <3>     3/25/94    JA        JBS: Changes to ChangeHighlight (1148310)
  128.          <2>     3/15/94    MB        Changes to support SCpp/ASLM builds,
  129.                                     #1150864.
  130.          <1>     3/11/94    JBS        first checked in
  131.          <5>     2/17/94    JBS        help fix#1142976
  132.          <4>     2/17/94    JBS        #1142976 fix inconsistent facet coords,
  133.                                      #1144049 ChangeExternalTransform notifies
  134.                                     parts of child facets
  135.          <3>     2/16/94    JA        Include new AltPoint.h.
  136.          <2>     2/15/94    JBS        RADAR bug #1141506 - fix grafPort origin
  137.                                     restoration in invalidation methods
  138.         <21>      2/7/94    JA        Capitalized THROW.
  139.         <20>      2/7/94    JA        Utility.h --> XMPUtils.h
  140.         <19>      2/3/94    JA        Tiger Team Makeover!
  141.         <18>      2/1/94    SS        SS: RootFacet fix to ::Update
  142.                                     JBS: Offscreen canvas fixes, better
  143.                                     in/validating
  144.         <17>     1/26/94    RR        Call Dispatcher::InvalidateFacetUnderMouse
  145.         <16>     1/24/94    SS        Checkin for Joshua (see below)
  146.         <15+>     1/13/94    JBS        active border displays fActiveShape
  147.                                        added offscreen canvas support
  148.         <15>     1/20/94    SS        Transform fix to GetAggregrateClipShape
  149.         <14>     1/11/94    TÇ        Init... changes
  150.         <13>    12/21/93    JBS        InitFacet changes
  151.         <12>    12/15/93    JBS        add fActiveShape & fWindow, plus accessors
  152.         <11>     12/3/93    TÇ        return ODFacet* from CreateEmebeddedFacet
  153.         <10>     12/3/93    TÇ        Stop including ODError.h, it is included
  154.                                     as ErrorDef.h inside Except.h
  155.          <9>    11/24/93    JA        cfront fixes.
  156.          <8>    11/24/93    VL        Rolled back changes as ASLM build breaks
  157.                                     the THINK build.
  158.          <7>    11/23/93    VL        Made this work with ASLM.
  159.          <6>    11/23/93    JA        Use new Shape API.
  160.          <5>    11/19/93    PH        Add casts to fix for CFront/ASLM
  161.          <4>    11/18/93    JBS        remove fWindow, add mouse tracking
  162.          <3>    11/16/93    JBS        add child drawing and moving methods
  163.          <2>    11/16/93    JBS        add fIsSelected, fHighlight
  164.          <1>    11/13/93    JBS        first checked in
  165.     
  166.     In Progress:
  167.         
  168. */
  169.  
  170. #define ODFacet_Class_Source
  171.  
  172. #ifndef SOM_ODFacet_xih
  173. #define VARIABLE_MACROS
  174. #include <Facet.xih>
  175. #endif
  176.  
  177. #ifndef _ALTPOINT_
  178. #include "AltPoint.h"
  179. #endif
  180.  
  181. #ifndef _FACETNOD_
  182. #include "FacetNod.h"
  183. #endif
  184.  
  185. #ifndef SOM_ODFacetIterator_xh
  186. #include "FacetItr.xh"
  187. #endif
  188.  
  189. #ifndef SOM_ODFrame_xh
  190. #include <Frame.xh>
  191. #endif
  192.  
  193. #ifndef SOM_ODPart_xh
  194. #include <Part.xh>
  195. #endif
  196.  
  197. #ifndef SOM_ODCanvas_xh
  198. #include <Canvas.xh>
  199. #endif
  200.  
  201. #ifndef SOM_ODShape_xh
  202. #include <Shape.xh>
  203. #endif
  204.  
  205. #ifndef SOM_ODTransform_xh
  206. #include <Trnsform.xh>
  207. #endif
  208.  
  209. #ifndef SOM_ODWindow_xh
  210. #include <Window.xh>
  211. #endif
  212.  
  213. #ifndef SOM_ODSession_xh
  214. #include <ODSessn.xh>
  215. #endif
  216.  
  217. #ifndef SOM_ODDispatcher_xh
  218. #include <Disptch.xh>
  219. #endif
  220.  
  221. #ifndef SOM_ODStorageUnit_xh
  222. #include <StorageU.xh>
  223. #endif
  224.  
  225. #ifndef _LINKLIST_
  226. #include "LinkList.h"
  227. #endif
  228.  
  229. #ifndef _NODE_
  230. #include "Node.h"
  231. #endif
  232.  
  233. #ifndef _EXCEPT_
  234. #include "Except.h"
  235. #endif
  236.  
  237. #ifndef _ODUTILS_
  238. #include <ODUtils.h>
  239. #endif
  240.  
  241. #ifndef _ODTYPES_
  242. #include <ODTypes.h>
  243. #endif
  244.  
  245. #ifndef _ODMEMORY_
  246. #include "ODMemory.h"
  247. #endif
  248.  
  249. #ifndef _ODMATH_
  250. #include "ODMath.h"
  251. #endif
  252.  
  253. #ifndef _FOCUSLIB_
  254. #include "FocusLib.h"
  255. #endif
  256.  
  257. #ifndef _BIAS_
  258. #include "Bias.h"
  259. #endif
  260.  
  261. #ifndef _BORDER_
  262. #include "Border.h"
  263. #endif
  264.  
  265. #ifndef _ODDEBUG_
  266. #include "ODDebug.h"
  267. #endif
  268.  
  269. #ifndef som_h
  270. #include "som.h"
  271. #endif
  272.  
  273. #ifndef __PRINTING__
  274. #include <Printing.h>
  275. #endif
  276.  
  277. #ifndef _TEMPOBJ_
  278. #include "TempObj.h"
  279. #endif
  280.  
  281. #pragma segment ODFacet
  282.  
  283.  
  284. //=====================================================================================
  285. // Constants
  286. //=====================================================================================
  287.  
  288. #define kNoBias kODNULL
  289.  
  290. //=====================================================================================
  291. // ODFacet
  292. //=====================================================================================
  293.  
  294. //------------------------------------------------------------------------------
  295. // ODFacet: somUninit
  296. //------------------------------------------------------------------------------
  297.  
  298. SOM_Scope void  SOMLINK ODFacetsomUninit(ODFacet *somSelf)
  299. {
  300.     ODFacetData *somThis = ODFacetGetData(somSelf);
  301.     ODFacetMethodDebug("ODFacet","somUninit");
  302.  
  303.     ODSafeReleaseObject(_fFrame);
  304.     ODSafeReleaseObject(_fClipShape);
  305.     ODSafeReleaseObject(_fActiveShape);
  306.     ODSafeReleaseObject(_fExternalTransform);
  307.     
  308.     if( _fNode ) {
  309.         Node* parent = _fNode->GetParent();
  310.         if (parent)
  311.             parent->RemoveChild(*_fNode);
  312.         delete _fNode;
  313.     }
  314.     
  315.     ODSafeReleaseObject(_fAggregateClipShape);
  316.     ODSafeReleaseObject(_fWindowAggregateClipShape);
  317.     ODSafeReleaseObject(_fFrameTransform);
  318.     ODSafeReleaseObject(_fContentTransform);
  319.     ODSafeReleaseObject(_fWindowFrameTransform);
  320.     ODSafeReleaseObject(_fWindowContentTransform);
  321.     ODSafeReleaseObject(_fActiveBorderShape);
  322. }
  323.  
  324. //------------------------------------------------------------------------------
  325. // ODFacet: InitFacet
  326. //------------------------------------------------------------------------------
  327.  
  328. SOM_Scope void  SOMLINK ODFacetInitFacet(ODFacet *somSelf, Environment *ev,
  329.         ODFrame* frame,
  330.         ODShape* clipShape,
  331.         ODTransform* externalTransform,
  332.         ODCanvas* canvas,
  333.         ODCanvas* biasCanvas)
  334. {
  335.     ODFacetData *somThis = ODFacetGetData(somSelf);
  336.     ODFacetMethodDebug("ODFacet","InitFacet");
  337.  
  338.     SOM_TRY
  339.     
  340.         if ( frame == kODNULL ) THROW(kODErrIllegalNullFrameInput);
  341.     
  342.         /* Moved from somInit. SOM itself sets fields to zero
  343.         _fFrame = kODNULL;
  344.         _fClipShape = kODNULL;
  345.         _fActiveShape = kODNULL;
  346.         _fExternalTransform = kODNULL;
  347.         _fCanvas = kODNULL;
  348.         _fPartInfo = kODNULL;
  349.         _fIsSelected = kODFalse;
  350.         
  351.         _fNode = kODNULL;
  352.         _fNeedsUpdate = kODFalse;
  353.         _fIsUpdating = kODFalse;
  354.     
  355.         _fAggregateClipShape = kODNULL;
  356.         _fWindowAggregateClipShape = kODNULL;
  357.         _fFrameTransform = kODNULL;
  358.         _fContentTransform = kODNULL;
  359.         _fWindowFrameTransform = kODNULL;
  360.         _fWindowContentTransform = kODNULL;
  361.         _fActiveBorderShape = kODNULL;
  362.         */
  363.         _fHighlight = kODNoHighlight;
  364.         
  365.         somSelf->InitObject(ev);
  366.         
  367.     
  368.         _fFrame = frame;
  369.         ODAcquireObject(ev, _fFrame);
  370.     
  371.         _fClipShape = BiasShapeSet(ev, clipShape, biasCanvas);
  372.         ODAcquireObject(ev, _fClipShape);
  373.     
  374.         _fExternalTransform = BiasTransformSet(ev, externalTransform, biasCanvas);
  375.         ODAcquireObject(ev, _fExternalTransform);
  376.     
  377.         if ( canvas )
  378.         {
  379.             _fCanvas = canvas;
  380.             _fCanvas->SetFacet(ev, somSelf);
  381.         }
  382.     
  383.         _fNode = new FacetNode(somSelf);    // must be a root facet!
  384.     SOM_CATCH_ALL
  385.     SOM_ENDTRY
  386. }
  387.  
  388. //------------------------------------------------------------------------------
  389. // ODFacet: InitChildFacet
  390. //------------------------------------------------------------------------------
  391.  
  392. SOM_Scope void  SOMLINK ODFacetInitChildFacet(ODFacet *somSelf, Environment *ev,
  393.         FacetNode* node,
  394.         ODFrame* frame,
  395.         ODShape* clipShape,
  396.         ODTransform* externalTransform,
  397.         ODCanvas* canvas,
  398.         ODCanvas* biasCanvas)
  399. {
  400.     ODFacetData *somThis = ODFacetGetData(somSelf);
  401.     ODFacetMethodDebug("ODFacet","InitChildFacet");
  402.  
  403.     SOM_TRY
  404.             
  405.         if ( node == kODNULL ) THROW(kODErrIllegalNullFacetInput);
  406.         if ( frame == kODNULL ) THROW(kODErrIllegalNullFrameInput);
  407.     
  408.         /* Moved from somInit. SOM itself sets fields to zero
  409.         _fFrame = kODNULL;
  410.         _fClipShape = kODNULL;
  411.         _fActiveShape = kODNULL;
  412.         _fExternalTransform = kODNULL;
  413.         _fCanvas = kODNULL;
  414.         _fPartInfo = kODNULL;
  415.         _fIsSelected = kODFalse;
  416.         
  417.         _fNode = kODNULL;
  418.         _fNeedsUpdate = kODFalse;
  419.         _fIsUpdating = kODFalse;
  420.     
  421.         _fAggregateClipShape = kODNULL;
  422.         _fWindowAggregateClipShape = kODNULL;
  423.         _fFrameTransform = kODNULL;
  424.         _fContentTransform = kODNULL;
  425.         _fWindowFrameTransform = kODNULL;
  426.         _fWindowContentTransform = kODNULL;
  427.         _fActiveBorderShape = kODNULL;
  428.         */
  429.         _fNode = node;
  430.  
  431.         _fHighlight = kODNoHighlight;
  432.         somSelf->InitObject(ev);
  433.     
  434.         _fFrame = frame;
  435.         ODAcquireObject(ev, _fFrame);
  436.     
  437.         _fClipShape = BiasShapeSet(ev, clipShape, biasCanvas);
  438.         ODAcquireObject(ev, _fClipShape);
  439.     
  440.         _fExternalTransform = BiasTransformSet(ev, externalTransform, biasCanvas);
  441.         ODAcquireObject(ev, _fExternalTransform);
  442.     
  443.         if ( canvas )
  444.         {
  445.             _fCanvas = canvas;
  446.             _fCanvas->SetFacet(ev, somSelf);
  447.         }
  448.     SOM_CATCH_ALL
  449.     SOM_ENDTRY
  450. }
  451.  
  452. //------------------------------------------------------------------------------
  453. // ODFacet: Purge
  454. //------------------------------------------------------------------------------
  455.  
  456. SOM_Scope ODSize  SOMLINK ODFacetPurge(ODFacet *somSelf, Environment *ev,
  457.         ODSize size)
  458. {
  459.     ODFacetData *somThis = ODFacetGetData(somSelf);
  460.     ODFacetMethodDebug("ODFacet","Purge");
  461.  
  462.     ODSize freed = 0;    ODVolatile(freed);
  463.  
  464.     SOM_TRY
  465.         // purge non-computed objects
  466.         if ( _fCanvas )                freed += _fCanvas->Purge(ev, size-freed);
  467.         if ( _fClipShape )            freed += _fClipShape->Purge(ev, size-freed);
  468.         if ( _fActiveShape )        freed += _fActiveShape->Purge(ev, size-freed);
  469.         if ( _fExternalTransform )    freed += _fExternalTransform->Purge(ev, size-freed);
  470.         if ( _fActiveBorderShape )    freed += _fActiveBorderShape->Purge(ev, size-freed);
  471.     
  472.         // flush cached geometry, purging first if other owners
  473.         if ( _fAggregateClipShape )
  474.         {
  475.             if ( _fAggregateClipShape->GetRefCount(ev) > 1 )
  476.                 freed += _fAggregateClipShape->Purge(ev, size-freed);
  477.             ODReleaseObject(ev, _fAggregateClipShape);
  478.         }
  479.         
  480.         if ( _fWindowAggregateClipShape )
  481.         {
  482.             if ( _fWindowAggregateClipShape->GetRefCount(ev) > 1 )
  483.                 freed += _fWindowAggregateClipShape->Purge(ev, size-freed);
  484.             ODReleaseObject(ev, _fWindowAggregateClipShape);
  485.         }
  486.         
  487.         if ( _fFrameTransform )
  488.         {
  489.             if ( _fFrameTransform->GetRefCount(ev) > 1 )
  490.                 freed += _fFrameTransform->Purge(ev, size-freed);
  491.             ODReleaseObject(ev, _fFrameTransform);
  492.         }
  493.         
  494.         if ( _fContentTransform )
  495.         {
  496.             if ( _fContentTransform->GetRefCount(ev) > 1 )
  497.                 freed += _fContentTransform->Purge(ev, size-freed);
  498.             ODReleaseObject(ev, _fContentTransform);
  499.         }
  500.         
  501.         if ( _fWindowFrameTransform )
  502.         {
  503.             if ( _fWindowFrameTransform->GetRefCount(ev) > 1 )
  504.                 freed += _fWindowFrameTransform->Purge(ev, size-freed);
  505.             ODReleaseObject(ev, _fWindowFrameTransform);
  506.         }
  507.         
  508.         if ( _fWindowContentTransform )
  509.         {
  510.             if ( _fWindowContentTransform->GetRefCount(ev) > 1 )
  511.                 freed += _fWindowContentTransform->Purge(ev, size-freed);
  512.             ODReleaseObject(ev, _fWindowContentTransform);
  513.         }    
  514.  
  515.         // dh - call parent's purge method
  516.          freed += parent_Purge(somSelf, ev, size);
  517.     SOM_CATCH_ALL
  518.         WARN("Error %ld trying to purge in ODFacetPurge",ErrorCode());
  519.         SetErrorCode(kODNoError);        // dh - Eat the exception; Purge should not 
  520.                                         // propagate it because clients function
  521.                                         // fine whether memory was purged or not.
  522.     SOM_ENDTRY
  523.     
  524.     return freed;
  525. }
  526.  
  527. //------------------------------------------------------------------------------
  528. // ODFacet: GetFrame
  529. //------------------------------------------------------------------------------
  530.  
  531. SOM_Scope ODFrame*  SOMLINK ODFacetGetFrame(ODFacet *somSelf, Environment *ev)
  532. {
  533.     ODFacetData *somThis = ODFacetGetData(somSelf);
  534.     ODFacetMethodDebug("ODFacet","GetFrame");
  535.  
  536.     return _fFrame;
  537. }
  538.  
  539. //------------------------------------------------------------------------------
  540. // ODFacet: CreateEmbeddedFacet
  541. //------------------------------------------------------------------------------
  542.  
  543. SOM_Scope ODFacet*  SOMLINK ODFacetCreateEmbeddedFacet(ODFacet *somSelf, Environment *ev,
  544.         ODFrame* frame,
  545.         ODShape* clipShape,
  546.         ODTransform* externalTransform,
  547.         ODCanvas* canvas,
  548.         ODCanvas* biasCanvas,
  549.         ODFacet* siblingFacet,
  550.         ODFramePosition position)
  551. {
  552.     ODFacetData *somThis = ODFacetGetData(somSelf);
  553.     ODFacetMethodDebug("ODFacet","CreateEmbeddedFacet");
  554.  
  555.     ODFacet* newFacet  = kODNULL;        ODVolatile(newFacet);
  556.     FacetNode* newNode = kODNULL;        ODVolatile(newNode);
  557.     FacetNode* childNode = kODNULL;
  558.  
  559.     SOM_TRY
  560.         if ( frame == kODNULL )
  561.             THROW(kODErrIllegalNullFrameInput);
  562.         if ( canvas != kODNULL )
  563.         {
  564.             TempODPart owner = canvas->AcquireOwner(ev);
  565.             if ( (ODPart*)owner == kODNULL )
  566.                 THROW(kODErrCanvasHasNoOwner);
  567.         }
  568.     
  569.         newFacet = new ODFacet();
  570.         THROW_IF_NULL(newFacet);
  571.         
  572.         newNode = new FacetNode(newFacet);
  573.         THROW_IF_NULL(newNode);
  574.         
  575.         if ( siblingFacet != kODNULL )
  576.             childNode = siblingFacet->GetNode(ev);
  577.     
  578.         if ( position == kODFrameInFront )
  579.         {
  580.             if ( childNode != kODNULL )
  581.                 _fNode->AddChildBefore(*childNode, newNode);
  582.             else
  583.                 _fNode->AddChildFirst(newNode);
  584.         }
  585.         else if ( position == kODFrameBehind )
  586.         {
  587.             if ( childNode != kODNULL )
  588.                 _fNode->AddChildAfter(*childNode, newNode);
  589.             else
  590.                 _fNode->AddChildLast(newNode);
  591.         }
  592.         else
  593.             THROW(kODErrUnsupportedFramePositionCode);
  594.     
  595.         newFacet->InitChildFacet(ev, newNode, frame, clipShape, externalTransform,
  596.                                     canvas, biasCanvas);
  597.         newNode = kODNULL;                            // owned by facet now
  598.         frame->FacetAdded(ev, newFacet);
  599.     SOM_CATCH_ALL
  600.         ODDeleteObject(newFacet);
  601.         if( newNode ) {
  602.             Node* parent = _fNode->GetParent();
  603.             if (parent)
  604.                 parent->RemoveChild(*newNode);
  605.             delete newNode;
  606.         }
  607.     SOM_ENDTRY
  608.     return newFacet;
  609. }
  610.             
  611. //------------------------------------------------------------------------------
  612. // ODFacet: RemoveFacet
  613. //------------------------------------------------------------------------------
  614.  
  615. SOM_Scope void  SOMLINK ODFacetRemoveFacet(ODFacet *somSelf, Environment *ev,
  616.         ODFacet* facet)
  617. {
  618.     ODFacetData *somThis = ODFacetGetData(somSelf);
  619.     ODFacetMethodDebug("ODFacet","RemoveFacet");
  620.  
  621.     SOM_TRY
  622.         ASSERT( (facet->GetContainingFacet(ev) == somSelf), kODErrInvalidFacet);
  623.         
  624.         // must get StorageUnit from part as frame might be non-persistent
  625.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  626.         tempPart->GetStorageUnit(ev)->GetSession(ev)->
  627.             GetDispatcher(ev)->InvalidateFacetUnderMouse(ev);
  628.         _fNode->RemoveChild(*(facet->GetNode(ev)));
  629.         facet->GetFrame(ev)->FacetRemoved(ev, facet);    // tells part to remove children
  630.     SOM_CATCH_ALL
  631.     SOM_ENDTRY
  632. }
  633.  
  634. //------------------------------------------------------------------------------
  635. // ODFacet: MoveBefore
  636. //------------------------------------------------------------------------------
  637.  
  638. SOM_Scope void  SOMLINK ODFacetMoveBefore(ODFacet *somSelf, Environment *ev,
  639.         ODFacet* child,
  640.         ODFacet* sibling)
  641. {
  642.     ODFacetData *somThis = ODFacetGetData(somSelf);
  643.     ODFacetMethodDebug("ODFacet","MoveBefore");
  644.  
  645.     SOM_TRY
  646.         Node* childNode;
  647.         Node* siblingNode;
  648.     
  649.         if ( child )
  650.         {
  651.             childNode = child->GetNode(ev);
  652.             _fNode->RemoveChild(*childNode);
  653.             if ( sibling )
  654.             {
  655.                 siblingNode = sibling->GetNode(ev);
  656.                 _fNode->AddChildBefore(*siblingNode, childNode);
  657.             }
  658.             else
  659.             {
  660.                 _fNode->AddChildFirst(childNode);
  661.             }
  662.         }
  663.     SOM_CATCH_ALL
  664.     SOM_ENDTRY
  665. }
  666.  
  667. //------------------------------------------------------------------------------
  668. // ODFacet: MoveBehind
  669. //------------------------------------------------------------------------------
  670.  
  671. SOM_Scope void  SOMLINK ODFacetMoveBehind(ODFacet *somSelf, Environment *ev,
  672.         ODFacet* child,
  673.         ODFacet* sibling)
  674. {
  675.     ODFacetData *somThis = ODFacetGetData(somSelf);
  676.     ODFacetMethodDebug("ODFacet","MoveBehind");
  677.  
  678.     SOM_TRY
  679.         Node* childNode;
  680.         Node* siblingNode;
  681.     
  682.         if ( child )
  683.         {
  684.             childNode = child->GetNode(ev);
  685.             _fNode->RemoveChild(*childNode);
  686.             if ( sibling )
  687.             {
  688.                 siblingNode = sibling->GetNode(ev);
  689.                 _fNode->AddChildAfter(*siblingNode, childNode);
  690.             }
  691.             else
  692.             {
  693.                 _fNode->AddChildLast(childNode);
  694.             }
  695.         }
  696.     SOM_CATCH_ALL
  697.     SOM_ENDTRY
  698. }
  699.  
  700. //------------------------------------------------------------------------------
  701. // ODFacet: GetContainingFacet
  702. //------------------------------------------------------------------------------
  703.  
  704. SOM_Scope ODFacet*  SOMLINK ODFacetGetContainingFacet(ODFacet *somSelf, Environment *ev)
  705. {
  706.     ODFacetData *somThis = ODFacetGetData(somSelf);
  707.     ODFacetMethodDebug("ODFacet","GetContainingFacet");
  708.  
  709.     SOM_TRY
  710.         FacetNode* parent = (FacetNode*) _fNode->GetParent();
  711.         if (parent)
  712.             return parent->GetFacet();
  713.         else
  714.             return kODNULL;
  715.     SOM_CATCH_ALL
  716.     SOM_ENDTRY
  717.     return kODNULL;
  718. }
  719.  
  720. //------------------------------------------------------------------------------
  721. // ODFacet: CreateFacetIterator
  722. //------------------------------------------------------------------------------
  723.  
  724. SOM_Scope ODFacetIterator*  SOMLINK ODFacetCreateFacetIterator(ODFacet *somSelf, Environment *ev,
  725.         ODTraversalType traversalType, 
  726.         ODSiblingOrder siblingOrder)
  727. {
  728.     ODFacetData *somThis = ODFacetGetData(somSelf);
  729.     ODFacetMethodDebug("ODFacet","CreateFacetIterator");
  730.  
  731.     ODFacetIterator* iter = kODNULL; ODVolatile(iter);
  732.     SOM_TRY
  733.         iter = new ODFacetIterator();
  734.         THROW_IF_NULL(iter);
  735.         iter->InitFacetIterator(ev, somSelf, traversalType, siblingOrder);
  736.     SOM_CATCH_ALL
  737.         ODDeleteObject(iter);
  738.         iter = kODNULL;
  739.     SOM_ENDTRY
  740.     return iter;
  741. }
  742.  
  743. //------------------------------------------------------------------------------
  744. // ODFacet: ChangeGeometry
  745. //------------------------------------------------------------------------------
  746.  
  747. SOM_Scope void  SOMLINK ODFacetChangeGeometry(ODFacet *somSelf, Environment *ev,
  748.         ODShape* clipShape,
  749.         ODTransform* transform,
  750.         ODCanvas* biasCanvas)
  751. {
  752.     ODFacetData *somThis = ODFacetGetData(somSelf);
  753.     ODFacetMethodDebug("ODFacet","ChangeGeometry");
  754.     
  755.     SOM_TRY
  756.         ODBoolean clipShapeChanged = kODFalse;
  757.         ODBoolean externalTransformChanged = kODFalse;
  758.     
  759.         if ( clipShape )
  760.         {
  761.             ODAcquireObject(ev, clipShape);
  762.             ODReleaseObject(ev, _fClipShape);
  763.             _fClipShape = BiasShapeSet(ev, clipShape, biasCanvas);
  764.             clipShapeChanged = kODTrue;
  765.             somSelf->InvalidateAggregateClipShape(ev);
  766.         }
  767.     
  768.         if ( transform )
  769.         {
  770.             ODAcquireObject(ev, transform);
  771.             ODReleaseObject(ev, _fExternalTransform);
  772.             _fExternalTransform = BiasTransformSet(ev, transform, biasCanvas);
  773.             externalTransformChanged = kODTrue;
  774.             somSelf->InvalidateAggregateTransforms(ev);
  775.             somSelf->InvalidateAggregateClipShape(ev);
  776.         }
  777.             
  778.         ODFacetIterator* i = new ODFacetIterator();
  779.         THROW_IF_NULL(i);
  780.         i->InitFacetIterator(ev, somSelf, kODTopDown, kODFrontToBack);
  781.         for (ODFacet* facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  782.         {
  783.             TempODPart tempPart = facet->GetFrame(ev)->AcquirePart(ev);
  784.             tempPart->GeometryChanged(ev, facet, clipShapeChanged, externalTransformChanged);
  785.         }
  786.         ODDeleteObject(i);
  787.     SOM_CATCH_ALL
  788.     SOM_ENDTRY
  789. }
  790.  
  791. //------------------------------------------------------------------------------
  792. // ODFacet: CreateShape
  793. //------------------------------------------------------------------------------
  794.  
  795. SOM_Scope ODShape*  SOMLINK ODFacetCreateShape(ODFacet *somSelf, Environment *ev)
  796. {
  797.     ODFacetData *somThis = ODFacetGetData(somSelf);
  798.     ODFacetMethodDebug("ODFacet","CreateShape");
  799.  
  800.     ODShape *s = kODNULL;  ODVolatile(s);
  801.     SOM_TRY
  802.         s = new ODShape;
  803.         THROW_IF_NULL(s);
  804.         s->InitShape(ev);
  805.     SOM_CATCH_ALL
  806.         ODDeleteObject(s);
  807.         s = kODNULL;
  808.     SOM_ENDTRY
  809.     return s;
  810. }
  811.  
  812.  
  813. //------------------------------------------------------------------------------
  814. // ODFacet: AcquireClipShape
  815. //------------------------------------------------------------------------------
  816.  
  817. SOM_Scope ODShape*  SOMLINK ODFacetAcquireClipShape(ODFacet *somSelf, Environment *ev,
  818.         ODCanvas* biasCanvas)
  819. {
  820.     ODFacetData *somThis = ODFacetGetData(somSelf);
  821.     ODFacetMethodDebug("ODFacet","AcquireClipShape");
  822.  
  823.     SOM_TRY
  824.         if ( _fClipShape )
  825.             return BiasShapeGet(ev, _fClipShape, biasCanvas);
  826.         else
  827.             return ODCopyAndRelease(ev,  _fFrame->AcquireFrameShape(ev, biasCanvas));
  828.     SOM_CATCH_ALL
  829.     SOM_ENDTRY
  830.     return kODNULL;
  831. }
  832.  
  833. //------------------------------------------------------------------------------
  834. // ODFacet: AcquireAggregateClipShape
  835. //------------------------------------------------------------------------------
  836.  
  837. SOM_Scope ODShape*  SOMLINK ODFacetAcquireAggregateClipShape(ODFacet *somSelf, Environment *ev,
  838.         ODCanvas* biasCanvas)
  839. {
  840.     ODFacetData *somThis = ODFacetGetData(somSelf);
  841.     ODFacetMethodDebug("ODFacet","AcquireAggregateClipShape");
  842.  
  843.     SOM_TRY
  844.         if ( !_fAggregateClipShape )
  845.         {
  846.             ODFacet* parent = somSelf->GetContainingFacet(ev);
  847.     
  848.             // Determine whether canvas is geometric or whether we can punt to regions: [jpa]
  849.             ODGeometryMode mode = _fCanvas  ?GetCanvasGeometryMode(ev,_fCanvas)
  850.                                             :kODLoseGeometry;
  851.                 
  852.             if ( _fCanvas && _fCanvas->IsOffscreen(ev) )
  853.             {
  854.                 _fAggregateClipShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  855.                 _fAggregateClipShape->SetGeometryMode(ev,mode);
  856.             }
  857.             else
  858.             {
  859.                 _fAggregateClipShape = ODCopyAndRelease(ev, somSelf->AcquireClipShape(ev, kODNULL));
  860.                 _fAggregateClipShape->SetGeometryMode(ev,mode);
  861.                 if ( parent )
  862.                 {
  863.                     TempODShape parentClip = kODNULL;
  864.                     TempODTransform xform = kODNULL;
  865.                     parentClip = ODCopyAndRelease(ev, parent->AcquireAggregateClipShape(ev, kODNULL));
  866.                     xform = ODCopyAndRelease(ev, 
  867.                         parent->GetFrame(ev)->AcquireInternalTransform(ev, kODNULL));
  868.                     if ( _fExternalTransform != kODNULL )
  869.                         xform->PreCompose(ev, _fExternalTransform);
  870.                     parentClip->InverseTransform(ev, xform);
  871.                     _fAggregateClipShape->Intersect(ev, parentClip);
  872.                 }
  873.             }
  874.         }
  875.         return BiasShapeGet(ev, _fAggregateClipShape, biasCanvas);
  876.     SOM_CATCH_ALL
  877.     SOM_ENDTRY
  878.     return kODNULL;
  879. }
  880.  
  881. //------------------------------------------------------------------------------
  882. // ODFacet: AcquireWindowAggregateClipShape
  883. //------------------------------------------------------------------------------
  884.  
  885. SOM_Scope ODShape*  SOMLINK ODFacetAcquireWindowAggregateClipShape(ODFacet *somSelf, Environment *ev,
  886.         ODCanvas* biasCanvas)
  887. {
  888.     ODFacetData *somThis = ODFacetGetData(somSelf);
  889.     ODFacetMethodDebug("ODFacet","AcquireWindowAggregateClipShape");
  890.  
  891.     SOM_TRY
  892.         ODFacet* parent = somSelf->GetContainingFacet(ev);
  893.     
  894.         if ( !_fWindowAggregateClipShape )
  895.         {
  896.             // Determine whether canvas is geometric or whether we can punt to regions: [jpa]
  897.             ODGeometryMode mode = _fCanvas  ?GetCanvasGeometryMode(ev,_fCanvas)
  898.                                             :kODLoseGeometry;
  899.             _fWindowAggregateClipShape = ODCopyAndRelease(ev, somSelf->AcquireClipShape(ev, kNoBias));
  900.             _fWindowAggregateClipShape->SetGeometryMode(ev,mode);
  901.             if ( parent )
  902.             {
  903.                 TempODShape parentClip = kODNULL;
  904.                 TempODTransform xform = kODNULL;
  905.                 parentClip = ODCopyAndRelease(ev, parent->AcquireWindowAggregateClipShape(ev, kNoBias));
  906.                 xform = ODCopyAndRelease(ev, 
  907.                     parent->GetFrame(ev)->AcquireInternalTransform(ev, kODNULL));
  908.                 if ( _fExternalTransform != kODNULL )
  909.                     xform->PreCompose(ev, _fExternalTransform);
  910.                 parentClip->InverseTransform(ev, xform);
  911.                 _fWindowAggregateClipShape->Intersect(ev, parentClip);
  912.             }
  913.         }
  914.         return BiasShapeGet(ev, _fWindowAggregateClipShape, biasCanvas);
  915.     SOM_CATCH_ALL
  916.     SOM_ENDTRY
  917.     return kODNULL;
  918. }
  919.  
  920. //------------------------------------------------------------------------------
  921. // ODFacet: InvalidateAggregateClipShape
  922. //------------------------------------------------------------------------------
  923.  
  924. SOM_Scope void  SOMLINK ODFacetInvalidateAggregateClipShape(ODFacet *somSelf, Environment *ev)
  925. {
  926.     ODFacetData *somThis = ODFacetGetData(somSelf);
  927.     ODFacetMethodDebug("ODFacet","InvalidateAggregateClipShape");
  928.  
  929.     SOM_TRY
  930.         // flush aggregate clip shapes
  931.         ODReleaseObject(ev, _fAggregateClipShape);
  932.         ODReleaseObject(ev, _fWindowAggregateClipShape);
  933.         
  934.         // must flush cached border shape, as it is based on aggClipShape
  935.         if ( _fActiveBorderShape != kODNULL )
  936.             somSelf->InvalidateActiveBorder(ev);
  937.     
  938.         LinkedListIterator iter((LinkedList*)_fNode);
  939.         for (FacetNode* node = (FacetNode*) iter.First();
  940.                 iter.IsNotComplete();
  941.                 node = (FacetNode*) iter.Next())
  942.         {
  943.             node->GetFacet()->InvalidateAggregateClipShape(ev);
  944.         }
  945.         
  946.     SOM_CATCH_ALL
  947.     SOM_ENDTRY
  948. }
  949.  
  950. //------------------------------------------------------------------------------
  951. // ODFacet: AcquireActiveShape
  952. //------------------------------------------------------------------------------
  953.  
  954. SOM_Scope ODShape*  SOMLINK ODFacetAcquireActiveShape(ODFacet *somSelf, Environment *ev,
  955.         ODCanvas* biasCanvas)
  956. {
  957.     ODFacetData *somThis = ODFacetGetData(somSelf);
  958.     ODFacetMethodDebug("ODFacet","AcquireActiveShape");
  959.  
  960.     SOM_TRY
  961.         if ( _fActiveShape )
  962.             return BiasShapeGet(ev, _fActiveShape, biasCanvas);
  963.         else
  964.             return ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, biasCanvas));
  965.     SOM_CATCH_ALL
  966.     SOM_ENDTRY
  967.     return kODNULL;
  968. }
  969.  
  970. //------------------------------------------------------------------------------
  971. // ODFacet: ChangeActiveShape
  972. //------------------------------------------------------------------------------
  973.  
  974. SOM_Scope void  SOMLINK ODFacetChangeActiveShape(ODFacet *somSelf, Environment *ev,
  975.         ODShape* activeShape,
  976.         ODCanvas* biasCanvas)
  977. {
  978.     ODFacetData *somThis = ODFacetGetData(somSelf);
  979.     ODFacetMethodDebug("ODFacet","ChangeActiveShape");
  980.     
  981.     SOM_TRY
  982.         if ( _fActiveBorderShape != kODNULL )
  983.         {
  984.             somSelf->InvalidateActiveBorder(ev);
  985.             ODFacet* contFacet = somSelf->GetContainingFacet(ev);
  986.             if ( contFacet != kODNULL )
  987.             {
  988.                 TempODPart part = contFacet->GetFrame(ev)->AcquirePart(ev);
  989.                 part->AdjustBorderShape(ev, somSelf, kODNULL);
  990.             }
  991.         }
  992.         
  993.         ODAcquireObject(ev, activeShape);
  994.         ODReleaseObject(ev, _fActiveShape);
  995.         _fActiveShape = BiasShapeSet(ev, activeShape, biasCanvas);
  996.     
  997.     SOM_CATCH_ALL
  998.     SOM_ENDTRY
  999. }
  1000.  
  1001. //------------------------------------------------------------------------------
  1002. // ODFrame: CreateTransform
  1003. //------------------------------------------------------------------------------
  1004.  
  1005. SOM_Scope ODTransform*  SOMLINK ODFacetCreateTransform(ODFacet *somSelf, Environment *ev)
  1006. {
  1007.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1008.     ODFacetMethodDebug("ODFacet","CreateTransform");
  1009.  
  1010.     ODTransform *t = kODNULL;  ODVolatile(t);
  1011.     
  1012.     SOM_TRY
  1013.         t = new ODTransform;
  1014.         THROW_IF_NULL(t);
  1015.         t->InitTransform(ev);
  1016.     SOM_CATCH_ALL
  1017.         ODDeleteObject(t);
  1018.         t = kODNULL;
  1019.     SOM_ENDTRY
  1020.     return t;
  1021. }
  1022.  
  1023. //------------------------------------------------------------------------------
  1024. // ODFacet: AcquireExternalTransform
  1025. //------------------------------------------------------------------------------
  1026.  
  1027. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireExternalTransform(ODFacet *somSelf, Environment *ev,
  1028.         ODCanvas* biasCanvas)
  1029. {
  1030.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1031.     ODFacetMethodDebug("ODFacet","AcquireExternalTransform");
  1032.  
  1033.     ODTransform* xform = kODNULL;
  1034.     
  1035.     SOM_TRY
  1036.         if ( _fExternalTransform != kODNULL )
  1037.             xform = _fExternalTransform;
  1038.         else
  1039.             xform = somSelf->CreateTransform(ev);
  1040.         return BiasTransformGet(ev, xform, biasCanvas);
  1041.     SOM_CATCH_ALL
  1042.     SOM_ENDTRY
  1043.     return kODNULL;
  1044. }
  1045.  
  1046. //------------------------------------------------------------------------------
  1047. // ODFacet: AcquireFrameTransform
  1048. //------------------------------------------------------------------------------
  1049.  
  1050. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireFrameTransform(ODFacet *somSelf, Environment *ev,
  1051.         ODCanvas* biasCanvas)
  1052. {
  1053.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1054.     ODFacetMethodDebug("ODFacet","AcquireFrameTransform");
  1055.  
  1056.     SOM_TRY
  1057.         ODFacet* parent = somSelf->GetContainingFacet(ev);
  1058.     
  1059.         if ( !_fFrameTransform )
  1060.         {
  1061.             if ( _fCanvas )
  1062.             {
  1063.                 if ( _fFrame->IsRoot(ev) && (_fExternalTransform != kODNULL) )
  1064.                     _fFrameTransform = _fExternalTransform->Copy(ev);
  1065.                 else
  1066.                     _fFrameTransform = somSelf->CreateTransform(ev);
  1067.             }
  1068.             else
  1069.             {
  1070.                 if ( _fExternalTransform != kODNULL )
  1071.                     _fFrameTransform = _fExternalTransform->Copy(ev);
  1072.                 else
  1073.                     _fFrameTransform = somSelf->CreateTransform(ev);
  1074.                 if ( parent )
  1075.                 {
  1076.                     TempODTransform xform = parent->AcquireContentTransform(ev, kODNULL);
  1077.                     _fFrameTransform->PostCompose(ev, xform);
  1078.                 }
  1079.             }
  1080.         }
  1081.         return BiasTransformGet(ev, _fFrameTransform, biasCanvas);
  1082.     SOM_CATCH_ALL
  1083.     SOM_ENDTRY
  1084.     return kODNULL;
  1085. }
  1086.  
  1087. //------------------------------------------------------------------------------
  1088. // ODFacet: AcquireContentTransform
  1089. //------------------------------------------------------------------------------
  1090.  
  1091. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireContentTransform(ODFacet *somSelf, Environment *ev,
  1092.         ODCanvas* biasCanvas)
  1093. {
  1094.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1095.     ODFacetMethodDebug("ODFacet","AcquireContentTransform");
  1096.  
  1097.     SOM_TRY
  1098.         if (!_fContentTransform)
  1099.         {
  1100.             _fContentTransform = ODCopyAndRelease(ev, _fFrame->AcquireInternalTransform(ev, kODNULL));
  1101.             TempODTransform xform = somSelf->AcquireFrameTransform(ev, kODNULL);
  1102.             _fContentTransform->PostCompose(ev, xform);
  1103.         }
  1104.         return BiasTransformGet(ev, _fContentTransform, biasCanvas);
  1105.     SOM_CATCH_ALL
  1106.     SOM_ENDTRY
  1107.     return kODNULL;
  1108. }
  1109.  
  1110. //------------------------------------------------------------------------------
  1111. // ODFacet: AcquireWindowFrameTransform
  1112. //------------------------------------------------------------------------------
  1113.  
  1114. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireWindowFrameTransform(ODFacet *somSelf, Environment *ev,
  1115.         ODCanvas* biasCanvas)
  1116. {
  1117.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1118.     ODFacetMethodDebug("ODFacet","AcquireWindowFrameTransform");
  1119.  
  1120.     SOM_TRY
  1121.         ODFacet* parent = somSelf->GetContainingFacet(ev);
  1122.     
  1123.         if (!_fWindowFrameTransform)
  1124.         {
  1125.             if ( _fExternalTransform != kODNULL )
  1126.                 _fWindowFrameTransform = _fExternalTransform->Copy(ev);
  1127.             else
  1128.                 _fWindowFrameTransform = somSelf->CreateTransform(ev);
  1129.             if (parent)
  1130.             {
  1131.                 TempODTransform xform = parent->AcquireWindowContentTransform(ev, kODNULL);
  1132.                 _fWindowFrameTransform->PostCompose(ev, xform);
  1133.             }
  1134.         }
  1135.         return BiasTransformGet(ev, _fWindowFrameTransform, biasCanvas);
  1136.     SOM_CATCH_ALL
  1137.     SOM_ENDTRY
  1138.     return kODNULL;
  1139. }
  1140.  
  1141. //------------------------------------------------------------------------------
  1142. // ODFacet: AcquireWindowContentTransform
  1143. //------------------------------------------------------------------------------
  1144.  
  1145. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireWindowContentTransform(ODFacet *somSelf, Environment *ev,
  1146.         ODCanvas* biasCanvas)
  1147. {
  1148.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1149.     ODFacetMethodDebug("ODFacet","AcquireWindowContentTransform");
  1150.  
  1151.     SOM_TRY
  1152.         if (!_fWindowContentTransform)
  1153.         {
  1154.             _fWindowContentTransform = ODCopyAndRelease(ev, _fFrame->AcquireInternalTransform(ev, kODNULL));
  1155.             TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1156.             _fWindowContentTransform->PostCompose(ev, xform);
  1157.         }
  1158.         return BiasTransformGet(ev, _fWindowContentTransform, biasCanvas);
  1159.     SOM_CATCH_ALL
  1160.     SOM_ENDTRY
  1161.     return kODNULL;
  1162. }
  1163.  
  1164. //------------------------------------------------------------------------------
  1165. // ODFacet: InternalTransformChanged
  1166. //------------------------------------------------------------------------------
  1167.  
  1168. SOM_Scope void  SOMLINK ODFacetInternalTransformChanged(ODFacet *somSelf, Environment *ev)
  1169. {
  1170.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1171.     ODFacetMethodDebug("ODFacet","InternalTransformChanged");
  1172.  
  1173.     ODFacetIterator* facets = kODNULL;    ODVolatile(facets);
  1174.     ODFacet* facet = kODNULL;
  1175.     
  1176.     SOM_TRY
  1177.         ODReleaseObject(ev, _fContentTransform);
  1178.         ODReleaseObject(ev, _fWindowContentTransform);
  1179.         
  1180.         // invalidate children
  1181.         LinkedListIterator iter((LinkedList*)_fNode);
  1182.         for (FacetNode* node = (FacetNode*) iter.First();
  1183.                 iter.IsNotComplete();
  1184.                 node = (FacetNode*) iter.Next())
  1185.         {
  1186.             node->GetFacet()->InvalidateAggregateClipShape(ev);
  1187.             node->GetFacet()->InvalidateAggregateTransforms(ev);
  1188.         }
  1189.         
  1190.         facets = somSelf->CreateFacetIterator(ev, kODTopDown, kODFrontToBack);
  1191.         for ( facet = facets->First(ev);
  1192.                 facets->IsNotComplete(ev);
  1193.                 facet = facets->Next(ev) )
  1194.         {
  1195.             TempODPart tempPart = facet->GetFrame(ev)->AcquirePart(ev);
  1196.             tempPart->GeometryChanged(ev, facet, kODFalse, kODTrue);
  1197.         }
  1198.         ODDeleteObject(facets);
  1199.         
  1200.     SOM_CATCH_ALL
  1201.         ODDeleteObject(facets);
  1202.     SOM_ENDTRY
  1203. }
  1204.  
  1205. //------------------------------------------------------------------------------
  1206. // ODFacet: InvalidateAggregateTransforms
  1207. //------------------------------------------------------------------------------
  1208.  
  1209. SOM_Scope void  SOMLINK ODFacetInvalidateAggregateTransforms(ODFacet *somSelf, Environment *ev)
  1210. {
  1211.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1212.     ODFacetMethodDebug("ODFacet","InvalidateAggregateTransforms");
  1213.  
  1214.     SOM_TRY
  1215.         ODReleaseObject(ev, _fFrameTransform);
  1216.         ODReleaseObject(ev, _fContentTransform);
  1217.         ODReleaseObject(ev, _fWindowFrameTransform);
  1218.         ODReleaseObject(ev, _fWindowContentTransform);
  1219.     
  1220.         // invalidate children
  1221.         LinkedListIterator iter((LinkedList*)_fNode);
  1222.         for (FacetNode* node = (FacetNode*) iter.First();
  1223.                 iter.IsNotComplete();
  1224.                 node = (FacetNode*) iter.Next())
  1225.         {
  1226.             node->GetFacet()->InvalidateAggregateTransforms(ev);
  1227.         }
  1228.     SOM_CATCH_ALL
  1229.     SOM_ENDTRY
  1230. }
  1231.  
  1232. //------------------------------------------------------------------------------
  1233. // ODFacet: CreateCanvas
  1234. //------------------------------------------------------------------------------
  1235.  
  1236. SOM_Scope ODCanvas*  SOMLINK ODFacetCreateCanvas(ODFacet *somSelf, Environment *ev,
  1237.         ODGraphicsSystem graphicsSystem,
  1238.         ODPlatformCanvas platformCanvas,
  1239.         ODBoolean isDynamic,
  1240.         ODBoolean isOffscreen)
  1241. {
  1242.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1243.     ODFacetMethodDebug("ODFacet","CreateCanvas");
  1244.     
  1245.     ODCanvas *c = kODNULL;  ODVolatile(c);
  1246.     
  1247.     SOM_TRY
  1248.         c = new ODCanvas;
  1249.         THROW_IF_NULL(c);
  1250.         c->InitCanvas(ev, graphicsSystem,platformCanvas,isDynamic,isOffscreen);
  1251.     SOM_CATCH_ALL
  1252.         ODDeleteObject(c);
  1253.         c = kODNULL;
  1254.     SOM_ENDTRY
  1255.     return c;
  1256. }
  1257.  
  1258. //------------------------------------------------------------------------------
  1259. // ODFacet: HasCanvas
  1260. //------------------------------------------------------------------------------
  1261.  
  1262. SOM_Scope ODBoolean  SOMLINK ODFacetHasCanvas(ODFacet *somSelf, Environment *ev)
  1263. {
  1264.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1265.     ODFacetMethodDebug("ODFacet","HasCanvas");
  1266.  
  1267.     return (_fCanvas != kODNULL);
  1268. }
  1269.  
  1270. //------------------------------------------------------------------------------
  1271. // ODFacet: GetCanvas
  1272. //------------------------------------------------------------------------------
  1273.  
  1274. SOM_Scope ODCanvas*  SOMLINK ODFacetGetCanvas(ODFacet *somSelf, Environment *ev)
  1275. {
  1276.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1277.     ODFacetMethodDebug("ODFacet","GetCanvas");
  1278.  
  1279.     SOM_TRY
  1280.         if (_fCanvas)
  1281.             return _fCanvas;
  1282.         else
  1283.         {
  1284.             ODFacet* parent = somSelf->GetContainingFacet(ev);
  1285.             if (parent)
  1286.                 return parent->GetCanvas(ev);
  1287.             else
  1288.                 THROW(kODErrCanvasNotFound);
  1289.         }
  1290.     SOM_CATCH_ALL
  1291.     SOM_ENDTRY
  1292.     return kODNULL;
  1293. }
  1294.  
  1295. SOM_Scope void  SOMLINK ODFacetChangeCanvas(ODFacet *somSelf, Environment *ev,
  1296.         ODCanvas* canvas)
  1297. {
  1298.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1299.     ODFacetMethodDebug("ODFacet","ChangeCanvas");
  1300.  
  1301.     // I don't manage storage for the canvas - that's up to my part!
  1302.  
  1303.     ODFacetIterator* i = kODNULL;    ODVolatile(i);
  1304.     SOM_TRY
  1305.         if ( canvas != kODNULL )
  1306.         {
  1307.             TempODPart owner = canvas->AcquireOwner(ev);
  1308.             if ( (ODPart*)owner == kODNULL )
  1309.                 THROW(kODErrCanvasHasNoOwner);
  1310.         }
  1311.  
  1312.         i = new ODFacetIterator();
  1313.         THROW_IF_NULL(i);
  1314.         i->InitFacetIterator(ev, somSelf, kODTopDown, kODBackToFront);
  1315.     
  1316.         if ( _fCanvas )
  1317.             _fCanvas->SetFacet(ev, kODNULL);
  1318.         _fCanvas = canvas;
  1319.         if ( _fCanvas )
  1320.         {
  1321.             _fCanvas->SetFacet(ev, somSelf);        // point back to this facet
  1322.             TempODShape tempShape = _fFrame->AcquireFrameShape(ev, kODNULL);
  1323.             _fCanvas->Invalidate(ev, tempShape); // contents are initially invalid
  1324.         }
  1325.         
  1326.         somSelf->InvalidateAggregateClipShape(ev);
  1327.         somSelf->InvalidateAggregateTransforms(ev);
  1328.  
  1329.         ODBoolean notFirst = kODFalse;
  1330.         for (ODFacet* facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  1331.         {
  1332.             if ( notFirst && facet->HasCanvas(ev) )
  1333.                 i->SkipChildren(ev);
  1334.             else
  1335.             {
  1336.                 TempODPart tempPart = facet->GetFrame(ev)->AcquirePart(ev);
  1337.                 tempPart->CanvasChanged(ev, somSelf);
  1338.             }
  1339.             notFirst = kODTrue;
  1340.         }
  1341.         ODDeleteObject(i);
  1342.     SOM_CATCH_ALL
  1343.         ODDeleteObject(i);
  1344.     SOM_ENDTRY
  1345. }
  1346.  
  1347. //------------------------------------------------------------------------------
  1348. // ODFacet: GetWindow
  1349. //------------------------------------------------------------------------------
  1350.  
  1351. SOM_Scope ODWindow*  SOMLINK ODFacetGetWindow(ODFacet *somSelf, Environment *ev)
  1352. {
  1353.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1354.     ODFacetMethodDebug("ODFacet","GetWindow");
  1355.  
  1356.     // this method returns fFrame's window.  getting the window from fFrame
  1357.     // automatically increments the window's refcount, but because the window
  1358.     // in an invariant of the facet we don't want to increment the refcount.
  1359.     // so after getting the window from the frame, release it to restore its
  1360.     // original refcount.
  1361.  
  1362.     ODWindow* window = kODNULL;
  1363.  
  1364.     SOM_TRY
  1365.         window = _fFrame->AcquireWindow(ev);
  1366.         if (window)
  1367.             window->Release(ev); // undo ref bump from frame->AcquireWindow;
  1368.         return window;
  1369.     SOM_CATCH_ALL
  1370.     SOM_ENDTRY
  1371.     return kODNULL;
  1372. }
  1373.  
  1374. //------------------------------------------------------------------------------
  1375. // ODFacet: GetPartInfo
  1376. //------------------------------------------------------------------------------
  1377.  
  1378. SOM_Scope ODInfoType  SOMLINK ODFacetGetPartInfo(ODFacet *somSelf, Environment *ev)
  1379. {
  1380.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1381.     ODFacetMethodDebug("ODFacet","GetPartInfo");
  1382.  
  1383.     return _fPartInfo;
  1384. }
  1385.  
  1386. SOM_Scope void  SOMLINK ODFacetSetPartInfo(ODFacet *somSelf, Environment *ev,
  1387.         ODInfoType partInfo)
  1388. {
  1389.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1390.     ODFacetMethodDebug("ODFacet","SetPartInfo");
  1391.  
  1392.     _fPartInfo = partInfo;
  1393. }
  1394.  
  1395. //------------------------------------------------------------------------------
  1396. // ODFacet: DragEnter
  1397. //------------------------------------------------------------------------------
  1398.  
  1399. SOM_Scope ODDragResult  SOMLINK ODFacetDragEnter(ODFacet *somSelf, Environment *ev,
  1400.         ODPoint* point,
  1401.         ODDragItemIterator* dragInfo,
  1402.         ODCanvas* biasCanvas)
  1403. {
  1404.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1405.     ODFacetMethodDebug("ODFacet","DragEnter");
  1406.  
  1407.     SOM_TRY
  1408.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1409.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1410.         xform->InvertPoint(ev, &bPoint);
  1411.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1412.         return tempPart->DragEnter(ev, dragInfo, somSelf, &bPoint);
  1413.     SOM_CATCH_ALL
  1414.     SOM_ENDTRY
  1415.     return kODFalse;
  1416. }
  1417.  
  1418. //------------------------------------------------------------------------------
  1419. // ODFacet: DragWithin
  1420. //------------------------------------------------------------------------------
  1421.  
  1422. SOM_Scope ODDragResult  SOMLINK ODFacetDragWithin(ODFacet *somSelf, Environment *ev,
  1423.         ODPoint* point,
  1424.         ODDragItemIterator* dragInfo,
  1425.         ODCanvas* biasCanvas)
  1426. {
  1427.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1428.     ODFacetMethodDebug("ODFacet","DragWithin");
  1429.  
  1430.     SOM_TRY
  1431.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1432.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1433.         xform->InvertPoint(ev, &bPoint);
  1434.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1435.         return tempPart->DragWithin(ev, dragInfo, somSelf, &bPoint);
  1436.     SOM_CATCH_ALL
  1437.     SOM_ENDTRY
  1438.     return kODFalse;
  1439. }
  1440.  
  1441. //------------------------------------------------------------------------------
  1442. // ODFacet: DragLeave
  1443. //------------------------------------------------------------------------------
  1444.  
  1445. SOM_Scope void  SOMLINK ODFacetDragLeave(ODFacet *somSelf, Environment *ev,
  1446.         ODPoint* point,
  1447.         ODCanvas* biasCanvas)
  1448. {
  1449.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1450.     ODFacetMethodDebug("ODFacet","DragLeave");
  1451.  
  1452.     SOM_TRY
  1453.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1454.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1455.         xform->InvertPoint(ev, &bPoint);
  1456.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1457.         tempPart->DragLeave(ev, somSelf, &bPoint);
  1458.     SOM_CATCH_ALL
  1459.     SOM_ENDTRY
  1460. }
  1461.  
  1462. //------------------------------------------------------------------------------
  1463. // ODFacet: Drop
  1464. //------------------------------------------------------------------------------
  1465.  
  1466. SOM_Scope ODDropResult  SOMLINK ODFacetDrop(ODFacet *somSelf, Environment *ev,
  1467.         ODPoint* point,
  1468.         ODDragItemIterator* dropInfo,
  1469.         ODCanvas* biasCanvas)
  1470. {
  1471.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1472.     ODFacetMethodDebug("ODFacet","Drop");
  1473.  
  1474.     SOM_TRY
  1475.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1476.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1477.         xform->InvertPoint(ev, &bPoint);
  1478.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1479.         return tempPart->Drop(ev, dropInfo, somSelf, &bPoint);
  1480.     SOM_CATCH_ALL
  1481.     SOM_ENDTRY
  1482.     return kODDropFail;
  1483. }
  1484.  
  1485. //------------------------------------------------------------------------------
  1486. // ODFacet: Update
  1487. //------------------------------------------------------------------------------
  1488.  
  1489. SOM_Scope void  SOMLINK ODFacetUpdate(ODFacet *somSelf, Environment *ev,
  1490.         ODShape* invalidShape,
  1491.         ODCanvas* biasCanvas)
  1492. {
  1493.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1494.     ODFacetMethodDebug("ODFacet","Update");
  1495.  
  1496.     ODFacet*        facet = kODNULL;
  1497.     ODBoolean        notFirst = kODFalse;
  1498.     
  1499.     SOM_TRY
  1500.         _fIsUpdating = kODTrue;
  1501.         
  1502.         TempODShape bShape = kODNULL;
  1503.         if ( invalidShape == kODNULL )
  1504.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1505.         else
  1506.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1507.         
  1508.         // transform bShape into window coords for intersection with
  1509.         // shapes of embedded facets
  1510.         TempODTransform wfXform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1511.         bShape->Transform(ev, wfXform);
  1512.         
  1513.         ODFacetIterator* i = new ODFacetIterator();
  1514.         THROW_IF_NULL(i);
  1515.         i->InitFacetIterator(ev, somSelf, kODTopDown, kODBackToFront);
  1516.         for (facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  1517.         {
  1518.             TempODShape aggClipShape = facet->AcquireAggregateClipShape(ev, kODNULL);
  1519.             TempODShape testShape = aggClipShape->Copy(ev);
  1520.             TempODTransform xform = facet->AcquireWindowFrameTransform(ev, kODNULL);
  1521.             testShape->Transform(ev, xform);
  1522.             // both bShape and testShape are now in window coords
  1523.             testShape->Intersect(ev, bShape);
  1524.             if ( testShape->IsEmpty(ev) )
  1525.                 i->SkipChildren(ev);
  1526.             else
  1527.             {
  1528.                 facet->SetNeedsUpdate(ev, kODTrue);
  1529.                 
  1530.                 // if facet has its own canvas, and facet is not the root facet,
  1531.                 // let the facet handle updating its children
  1532.                 if ( facet->HasCanvas(ev) && notFirst )
  1533.                     i->SkipChildren(ev);
  1534.             }
  1535.             notFirst = kODTrue;
  1536.         }
  1537.         
  1538.         for (facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  1539.         {
  1540.             if ( facet->NeedsUpdate(ev) )
  1541.             {
  1542.                 TempODShape testShape = bShape->Copy(ev);
  1543.                 TempODTransform xform = facet->AcquireWindowFrameTransform(ev, kODNULL);
  1544.                 testShape->InverseTransform(ev, xform);
  1545.                 facet->Draw(ev, testShape, kODNULL);
  1546.             }
  1547.             else
  1548.                 i->SkipChildren(ev);
  1549.         }
  1550.     
  1551.         _fIsUpdating = kODFalse;
  1552.     
  1553.         delete i;
  1554.     SOM_CATCH_ALL
  1555.     SOM_ENDTRY
  1556. }
  1557.  
  1558. //------------------------------------------------------------------------------
  1559. // ODFacet: Invalidate
  1560. //------------------------------------------------------------------------------
  1561.  
  1562. SOM_Scope void  SOMLINK ODFacetInvalidate(ODFacet *somSelf, Environment *ev,
  1563.         ODShape* invalidShape,
  1564.         ODCanvas* biasCanvas)
  1565. {
  1566.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1567.     ODFacetMethodDebug("ODFacet","Invalidate");
  1568.  
  1569.     //    Assumes invalidShape is in frame coordinates.
  1570.     
  1571.     ODCanvas* myCanvas = kODNULL;
  1572.     ODFacet* myCanvasFacet = kODNULL;
  1573.     ODFacet* myContainingFacet = kODNULL;
  1574.     ODFacet* parentCanvasFacet = kODNULL;
  1575.  
  1576.     SOM_TRY
  1577.         ODWindow* window = somSelf->GetWindow(ev);
  1578.         if( !window )
  1579.             return;
  1580.         
  1581.         TempODShape tShape = ODCopyAndRelease(ev, somSelf->AcquireAggregateClipShape(ev, kODNULL));
  1582.         if ( invalidShape )
  1583.         {
  1584.             TempODShape bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1585.             tShape->Intersect(ev, bShape);
  1586.         }
  1587.         
  1588.         if( !tShape->IsEmpty(ev) )
  1589.         {
  1590.             myCanvas = somSelf->GetCanvas(ev);
  1591.             
  1592.             TempODTransform xf1 = somSelf->AcquireFrameTransform(ev, kODNULL);
  1593.             tShape->Transform(ev, xf1);
  1594.             myCanvas->Invalidate(ev, tShape);
  1595.             tShape->InverseTransform(ev, xf1);
  1596.  
  1597.             if ( myCanvas->IsOffscreen(ev) )
  1598.             {
  1599.                 myCanvasFacet = myCanvas->GetFacet(ev);
  1600.                 myContainingFacet = myCanvasFacet->GetContainingFacet(ev);
  1601.                 if ( myContainingFacet )
  1602.                     parentCanvasFacet = myContainingFacet->GetCanvas(ev)->GetFacet(ev);
  1603.                 else
  1604.                     THROW(kODErrFacetNotFound);
  1605.             
  1606.                 TempODTransform xf2 = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1607.                 tShape->Transform(ev, xf2);
  1608.                 TempODTransform xf3 = parentCanvasFacet->AcquireWindowFrameTransform(ev, kODNULL);
  1609.                 tShape->InverseTransform(ev, xf3);
  1610.                 parentCanvasFacet->Invalidate(ev, tShape, kODNULL);
  1611.             }
  1612.         }
  1613.     SOM_CATCH_ALL
  1614.     SOM_ENDTRY
  1615. }
  1616.  
  1617. //------------------------------------------------------------------------------
  1618. // ODFacet: Validate
  1619. //------------------------------------------------------------------------------
  1620.  
  1621. SOM_Scope void  SOMLINK ODFacetValidate(ODFacet *somSelf, Environment *ev,
  1622.         ODShape* validShape,
  1623.         ODCanvas* biasCanvas)
  1624. {
  1625.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1626.     ODFacetMethodDebug("ODFacet","Validate");
  1627.  
  1628.     //    Assumes validShape is in frame coordinates.
  1629.     
  1630.     ODCanvas* myCanvas = kODNULL;
  1631.     ODTransform* xform = kODNULL;
  1632.  
  1633.     SOM_TRY
  1634.         ODWindow* window = somSelf->GetWindow(ev);
  1635.         if( !window )
  1636.             return;
  1637.         
  1638.         TempODShape tShape = ODCopyAndRelease(ev, somSelf->AcquireAggregateClipShape(ev, kODNULL));
  1639.         if ( validShape )
  1640.         {
  1641.             TempODShape bShape = BiasShapeSet(ev, validShape->Copy(ev), biasCanvas);
  1642.             tShape->Intersect(ev, bShape);
  1643.         }    
  1644.         
  1645.         if( !tShape->IsEmpty(ev) )
  1646.         {
  1647.             myCanvas = somSelf->GetCanvas(ev);
  1648.  
  1649.             TempODTransform xform = somSelf->AcquireFrameTransform(ev, kODNULL);
  1650.             tShape->Transform(ev, xform);
  1651.             myCanvas->Validate(ev, tShape);
  1652.         }
  1653.     SOM_CATCH_ALL
  1654.     SOM_ENDTRY
  1655. }
  1656.  
  1657. //------------------------------------------------------------------------------
  1658. // ODFacet: Draw
  1659. //------------------------------------------------------------------------------
  1660.  
  1661. SOM_Scope void  SOMLINK ODFacetDraw(ODFacet *somSelf, Environment *ev,
  1662.         ODShape* invalidShape,
  1663.         ODCanvas* biasCanvas)
  1664. {
  1665.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1666.     ODFacetMethodDebug("ODFacet","Draw");
  1667.  
  1668.     SOM_TRY
  1669.         TempODShape bShape = kODNULL;
  1670.         if ( invalidShape == kODNULL )
  1671.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1672.         else
  1673.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1674.     
  1675.         if ( _fCanvas && !_fIsUpdating && _fCanvas->IsOffscreen(ev) )
  1676.         {
  1677.             // repair canvas if needs updating
  1678.             TempODShape testShape = bShape->Copy(ev);
  1679.             TempODShape updateShape = _fCanvas->AcquireUpdateShape(ev);
  1680.             testShape->Intersect(ev, updateShape);
  1681.     
  1682.             if ( !testShape->IsEmpty(ev) )
  1683.             {
  1684.                 // fix offscreen canvas
  1685.                 somSelf->Update(ev, bShape, kODNULL);
  1686.             }
  1687.             
  1688.             // tell canvas owner part to copy pixels
  1689.             TempODPart owner = _fCanvas->AcquireOwner(ev);
  1690.             owner->CanvasUpdated(ev, _fCanvas);
  1691.         }
  1692.         else
  1693.         {
  1694.             TempODPart tempPart = _fFrame->AcquirePart(ev);
  1695.             tempPart->Draw(ev, somSelf, bShape);
  1696.         }
  1697.         _fNeedsUpdate = kODFalse;
  1698.     SOM_CATCH_ALL
  1699.     SOM_ENDTRY
  1700. }
  1701.  
  1702. //------------------------------------------------------------------------------
  1703. // ODFacet: DrawChildren
  1704. //------------------------------------------------------------------------------
  1705.  
  1706. SOM_Scope void  SOMLINK ODFacetDrawChildren(ODFacet *somSelf, Environment *ev,
  1707.         ODShape* invalidShape,
  1708.         ODCanvas* biasCanvas)
  1709. {
  1710.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1711.     ODFacetMethodDebug("ODFacet","DrawChildren");
  1712.     
  1713.     SOM_TRY
  1714.         TempODShape bShape = kODNULL;
  1715.         if ( invalidShape == kODNULL )
  1716.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1717.         else
  1718.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1719.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1720.         bShape->Transform(ev, xform);
  1721.     
  1722.         ODFacetIterator* i = new ODFacetIterator;
  1723.         THROW_IF_NULL(i);
  1724.         i->InitFacetIterator(ev, somSelf, kODChildrenOnly, kODBackToFront);
  1725.     
  1726.         for ( ODFacet* child = i->First(ev); i->IsNotComplete(ev); child = i->Next(ev) )
  1727.         {
  1728.             if ( child->NeedsUpdate(ev) )
  1729.             {
  1730.                 TempODTransform xf2 = child->AcquireWindowFrameTransform(ev, kODNULL);
  1731.                 TempODShape tempShape = bShape->Copy(ev);
  1732.                 tempShape->InverseTransform(ev, xf2);
  1733.                 child->Draw(ev, tempShape, kODNULL);
  1734.                 child->DrawChildren(ev, tempShape, kODNULL);
  1735.             }
  1736.         }
  1737.         ODDeleteObject(i);
  1738.     SOM_CATCH_ALL
  1739.     SOM_ENDTRY
  1740. }
  1741.  
  1742. //------------------------------------------------------------------------------
  1743. // ODFacet: DrawChildrenAlways
  1744. //------------------------------------------------------------------------------
  1745.  
  1746. SOM_Scope void  SOMLINK ODFacetDrawChildrenAlways(ODFacet *somSelf, Environment *ev,
  1747.         ODShape* invalidShape,
  1748.         ODCanvas* biasCanvas)
  1749. {
  1750.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1751.     ODFacetMethodDebug("ODFacet","DrawChildrenAlways");
  1752.  
  1753.     SOM_TRY
  1754.         TempODShape bShape = kODNULL;
  1755.         if ( invalidShape == kODNULL )
  1756.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1757.         else
  1758.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1759.         TempODTransform xf1 = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1760.         bShape->Transform(ev, xf1);
  1761.     
  1762.         ODFacetIterator* i = new ODFacetIterator;
  1763.         THROW_IF_NULL(i);
  1764.         i->InitFacetIterator(ev, somSelf, kODChildrenOnly, kODBackToFront);
  1765.     
  1766.         for ( ODFacet* child = i->First(ev); i->IsNotComplete(ev); child = i->Next(ev) )
  1767.         {
  1768.             TempODTransform xf2 = child->AcquireWindowFrameTransform(ev, kODNULL);
  1769.             TempODShape tempShape = bShape->Copy(ev);
  1770.             tempShape->InverseTransform(ev, xf2);
  1771.             child->Draw(ev, tempShape, kODNULL);
  1772.             child->DrawChildrenAlways(ev, tempShape, kODNULL);
  1773.         }
  1774.         ODDeleteObject(i);
  1775.     SOM_CATCH_ALL
  1776.     SOM_ENDTRY
  1777. }
  1778.  
  1779. //------------------------------------------------------------------------------
  1780. // ODFacet: InvalidateActiveBorder
  1781. //------------------------------------------------------------------------------
  1782. SOM_Scope void  SOMLINK ODFacetInvalidateActiveBorder(ODFacet *somSelf, Environment *ev)
  1783. {
  1784.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1785.     ODFacetMethodDebug("ODFacet","InvalidateActiveBorder");
  1786.  
  1787.     SOM_TRY
  1788.         if ( _fActiveBorderShape != kODNULL )
  1789.         {
  1790.             ODInvalidateBorder(ev, _fActiveBorderShape, somSelf);
  1791.             ODReleaseObject(ev, _fActiveBorderShape);
  1792.         }
  1793.     SOM_CATCH_ALL
  1794.     SOM_ENDTRY
  1795. }
  1796.  
  1797. //------------------------------------------------------------------------------
  1798. // ODFacet: DrawActiveBorder
  1799. //------------------------------------------------------------------------------
  1800. SOM_Scope void  SOMLINK ODFacetDrawActiveBorder(ODFacet *somSelf, Environment *ev)
  1801. {
  1802.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1803.     ODFacetMethodDebug("ODFacet","DrawActiveBorder");
  1804.  
  1805.     SOM_TRY
  1806.         ODFacet* contFacet = kODNULL;
  1807.         TempODPart contPart = kODNULL;
  1808.         TempODShape border = kODNULL;
  1809.         TempODShape scratch = kODNULL;
  1810.         TempODShape adjusted = kODNULL;
  1811.         TempODShape clip = kODNULL;
  1812.         TempODTransform xform = kODNULL;
  1813.         TempODTransform xform2 = kODNULL;
  1814.         TempODTransform xform3 = kODNULL;
  1815.     
  1816.         if ( _fActiveBorderShape == kODNULL )
  1817.         {
  1818.             // compute border shape
  1819.             contFacet = somSelf->GetContainingFacet(ev);
  1820.             if ( contFacet )
  1821.             {
  1822.                 contPart = contFacet->GetFrame(ev)->AcquirePart(ev);
  1823.                 border = ODCopyAndRelease(ev, somSelf->AcquireActiveShape(ev, kNoBias));
  1824.                 xform = somSelf->AcquireWindowFrameTransform(ev, kNoBias);
  1825.                 xform2 = contFacet->AcquireWindowFrameTransform(ev, kNoBias);
  1826.                 border->Transform(ev, xform);
  1827.                 border->SetGeometryMode(ev, kODLoseGeometry);
  1828.                 scratch = border->Copy(ev);
  1829.                 
  1830.                 border->Outset(ev, ODIntToFixed(4));
  1831.                 border->Subtract(ev, scratch);
  1832.                 ODReleaseObject(ev, scratch);
  1833.                 
  1834.                 border->InverseTransform(ev, xform);
  1835.                 adjusted = contPart->AdjustBorderShape(ev, somSelf, border);
  1836.                 THROW_IF_NULL(adjusted);
  1837.                 ODReleaseObject(ev, border);
  1838.                 
  1839.                 if ( adjusted->IsEmpty(ev) )
  1840.                 {
  1841.                     // compute as inset
  1842.                     scratch = ODCopyAndRelease(ev, contFacet->GetFrame(ev)->AcquireUsedShape(ev, kNoBias));
  1843.                     scratch->Transform(ev, xform2);
  1844.                     TempODShape testShape = scratch->Copy(ev);
  1845.                     border = ODCopyAndRelease(ev, somSelf->AcquireActiveShape(ev, kNoBias));
  1846.                     border->Transform(ev, xform);
  1847.                     testShape->Subtract(ev, border);
  1848.                     if ( testShape->IsEmpty(ev) )
  1849.                     {
  1850.                         ODReleaseObject(ev, adjusted);
  1851.                         ODReleaseObject(ev, border);
  1852.                         border = scratch->Copy(ev);
  1853.                         scratch->Outset(ev, ODIntToFixed(-4));
  1854.                         border->Subtract(ev, scratch);
  1855.                         ODReleaseObject(ev, scratch);
  1856.                         
  1857.                         border->InverseTransform(ev, xform);
  1858.                         adjusted = contPart->AdjustBorderShape(ev, somSelf, border);
  1859.                         THROW_IF_NULL(adjusted);
  1860.                         ODReleaseObject(ev, border);
  1861.                     }
  1862.                     else
  1863.                     {
  1864.                         ODReleaseObject(ev, border);
  1865.                         ODReleaseObject(ev, scratch);
  1866.                     }
  1867.                 }
  1868.                 
  1869.                 // clip to containing facet's visible area
  1870.                 clip = ODCopyAndRelease(ev,
  1871.                     contFacet->AcquireWindowAggregateClipShape(ev, kNoBias));
  1872.                 xform3 = ODCopyAndRelease(ev, 
  1873.                     contFacet->GetFrame(ev)->AcquireInternalTransform(ev, kNoBias));
  1874.                 if ( _fExternalTransform != kODNULL )
  1875.                     xform3->PreCompose(ev, _fExternalTransform);
  1876.                 clip->InverseTransform(ev, xform3);
  1877.                 adjusted->Intersect(ev, clip);
  1878.                 
  1879.                 adjusted->Transform(ev, xform);
  1880.                 adjusted->Acquire(ev);    // because TempODShape releases on scope exit
  1881.                 _fActiveBorderShape = adjusted;
  1882.             }
  1883.         }
  1884.         
  1885.         ODWindow* window = somSelf->GetWindow(ev);
  1886.         if ( _fActiveBorderShape && window && window->IsShown(ev) )
  1887.         {
  1888.             ODDrawBorder(ev, _fActiveBorderShape, somSelf);
  1889.         }
  1890.     SOM_CATCH_ALL
  1891.     SOM_ENDTRY
  1892. }
  1893.  
  1894. //------------------------------------------------------------------------------
  1895. // ODFacet: DrawnIn
  1896. //------------------------------------------------------------------------------
  1897.  
  1898. SOM_Scope void  SOMLINK ODFacetDrawnIn(ODFacet *somSelf, Environment *ev,
  1899.         ODShape* shape,
  1900.         ODCanvas* biasCanvas)
  1901. {
  1902.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1903.     ODFacetMethodDebug("ODFacet","DrawnIn");
  1904.  
  1905.     // invalidate shape on my parent canvas to ensure that changed
  1906.     // pixels get copied to it.
  1907.     
  1908.     ODCanvas* myCanvas = kODNULL;
  1909.     ODFacet* myCanvasFacet = kODNULL;
  1910.     ODFacet* containingFacet = kODNULL;
  1911.     ODFacet* parentCanvasFacet = kODNULL;
  1912.  
  1913.     SOM_TRY
  1914.         // since the shape has been drawn in, it can now be marked as valid
  1915.         somSelf->Validate(ev, shape, biasCanvas);
  1916.         
  1917.         myCanvas = somSelf->GetCanvas(ev);
  1918.     
  1919.         // don't need to worry about on-screen canvas - it's the window
  1920.         if ( !myCanvas->IsOffscreen(ev) )
  1921.             return;
  1922.     
  1923.         TempODShape tShape = ODCopyAndRelease(ev, somSelf->AcquireAggregateClipShape(ev, kODNULL));
  1924.         if ( shape )
  1925.         {
  1926.             TempODShape bShape = BiasShapeSet(ev, shape->Copy(ev), biasCanvas);
  1927.             tShape->Intersect(ev, bShape);
  1928.         }    
  1929.  
  1930.         myCanvasFacet = myCanvas->GetFacet(ev);
  1931.         containingFacet = myCanvasFacet->GetContainingFacet(ev);
  1932.         if ( containingFacet )
  1933.             parentCanvasFacet = containingFacet->GetCanvas(ev)->GetFacet(ev);
  1934.         else
  1935.             THROW(kODErrFacetNotFound);
  1936.     
  1937.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1938.         tShape->Transform(ev, xform);
  1939.         ODReleaseObject(ev, xform);
  1940.         xform = parentCanvasFacet->AcquireWindowFrameTransform(ev, kODNULL);
  1941.         tShape->InverseTransform(ev, xform);
  1942.     
  1943.         // since stuff was drawn on my canvas, invalidate my parent canvas
  1944.         // so that that content will get copied there.
  1945.         parentCanvasFacet->Invalidate(ev, tShape, kODNULL);
  1946.     
  1947.         // notify my canvas' owner that drawing has occurred, and pixels
  1948.         // need to be copied to the parent canvas
  1949.         TempODPart owner = myCanvas->AcquireOwner(ev);
  1950.         WASSERTM( owner != kODNULL, "Facet::DrawnIn - no owner for canvas");
  1951.         owner->CanvasUpdated(ev, myCanvas);
  1952.     SOM_CATCH_ALL
  1953.     SOM_ENDTRY
  1954. }
  1955.  
  1956. //------------------------------------------------------------------------------
  1957. // ODFacet: ContainsPoint
  1958. //------------------------------------------------------------------------------
  1959.  
  1960. SOM_Scope ODBoolean  SOMLINK ODFacetContainsPoint(ODFacet *somSelf, Environment *ev,
  1961.         ODPoint* point,
  1962.         ODCanvas* biasCanvas)
  1963. {
  1964.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1965.     ODFacetMethodDebug("ODFacet","ContainsPoint");
  1966.  
  1967.     ODBoolean result = kODFalse;    ODVolatile(result);
  1968.     
  1969.     SOM_TRY
  1970.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1971.         if ( _fActiveShape || _fClipShape )
  1972.             result = ((!_fActiveShape || _fActiveShape->ContainsPoint(ev, &bPoint))
  1973.                      && (!_fClipShape || _fClipShape->ContainsPoint(ev, &bPoint)));
  1974.         else
  1975.         {
  1976.             TempODShape frameShape = _fFrame->AcquireFrameShape(ev, kNoBias);
  1977.             result = frameShape->ContainsPoint(ev, &bPoint);
  1978.         }
  1979.     SOM_CATCH_ALL
  1980.         result = kODFalse;
  1981.     SOM_ENDTRY
  1982.  
  1983.     return result;
  1984. }
  1985.  
  1986. //------------------------------------------------------------------------------
  1987. // ODFacet: ActiveBorderContainsPoint
  1988. //------------------------------------------------------------------------------
  1989.  
  1990. SOM_Scope ODBoolean  SOMLINK ODFacetActiveBorderContainsPoint(ODFacet *somSelf, Environment *ev,
  1991.         ODPoint* point,
  1992.         ODCanvas* biasCanvas)
  1993. {
  1994.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1995.     ODFacetMethodDebug("ODFacet","ActiveBorderContainsPoint");
  1996.  
  1997.     if ( _fActiveBorderShape == kODNULL )
  1998.         return kODFalse;
  1999.  
  2000.     SOM_TRY
  2001.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  2002.         // transform point to window coordinates
  2003.         TempODTransform winToFrame = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  2004.     
  2005.         ODPoint framePoint = bPoint;
  2006.         winToFrame->TransformPoint(ev, &framePoint);
  2007.         return _fActiveBorderShape->ContainsPoint(ev, &framePoint);
  2008.     SOM_CATCH_ALL
  2009.     SOM_ENDTRY
  2010.     return kODFalse;
  2011. }
  2012.  
  2013. //------------------------------------------------------------------------------
  2014. // ODFacet: IsSelected
  2015. //------------------------------------------------------------------------------
  2016.  
  2017. SOM_Scope ODBoolean  SOMLINK ODFacetIsSelected(ODFacet *somSelf, Environment *ev)
  2018. {
  2019.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2020.     ODFacetMethodDebug("ODFacet","IsSelected");
  2021.  
  2022.     return _fIsSelected;
  2023. }
  2024.  
  2025. //------------------------------------------------------------------------------
  2026. // ODFacet: SetSelected
  2027. //------------------------------------------------------------------------------
  2028.  
  2029. SOM_Scope void  SOMLINK ODFacetSetSelected(ODFacet *somSelf, Environment *ev,
  2030.         ODBoolean isSelected)
  2031. {
  2032.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2033.     ODFacetMethodDebug("ODFacet","SetSelected");
  2034.  
  2035.     _fIsSelected = isSelected;
  2036. }
  2037.  
  2038. //------------------------------------------------------------------------------
  2039. // ODFacet: GetHighlight
  2040. //------------------------------------------------------------------------------
  2041.  
  2042. SOM_Scope ODHighlight  SOMLINK ODFacetGetHighlight(ODFacet *somSelf, Environment *ev)
  2043. {
  2044.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2045.     ODFacetMethodDebug("ODFacet","GetHighlight");
  2046.  
  2047.     return _fHighlight;
  2048. }
  2049.  
  2050. //------------------------------------------------------------------------------
  2051. // ODFacet: ChangeHighlight
  2052. //------------------------------------------------------------------------------
  2053.  
  2054. SOM_Scope void  SOMLINK ODFacetChangeHighlight(ODFacet *somSelf, Environment *ev,
  2055.         ODHighlight highlight)
  2056. {
  2057.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2058.     ODFacetMethodDebug("ODFacet","ChangeHighlight");
  2059.  
  2060.     SOM_TRY
  2061.         _fHighlight = highlight;
  2062.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  2063.         tempPart->HighlightChanged(ev, somSelf);
  2064.     SOM_CATCH_ALL
  2065.     SOM_ENDTRY
  2066. }
  2067.  
  2068. //------------------------------------------------------------------------------
  2069. // ODFacet: GetNode
  2070. //------------------------------------------------------------------------------
  2071.  
  2072. SOM_Scope FacetNode*  SOMLINK ODFacetGetNode(ODFacet *somSelf, Environment *ev)
  2073. {
  2074.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2075.     ODFacetMethodDebug("ODFacet","GetNode");
  2076.  
  2077.     return _fNode;
  2078. }
  2079.  
  2080. //------------------------------------------------------------------------------
  2081. // ODFacet: NeedsUpdate
  2082. //------------------------------------------------------------------------------
  2083.  
  2084. SOM_Scope ODBoolean  SOMLINK ODFacetNeedsUpdate(ODFacet *somSelf, Environment *ev)
  2085. {
  2086.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2087.     ODFacetMethodDebug("ODFacet","NeedsUpdate");
  2088.  
  2089.     return _fNeedsUpdate;
  2090. }
  2091.  
  2092. //------------------------------------------------------------------------------
  2093. // ODFacet: SetNeedsUpdate
  2094. //------------------------------------------------------------------------------
  2095.  
  2096. SOM_Scope void  SOMLINK ODFacetSetNeedsUpdate(ODFacet *somSelf, Environment *ev,
  2097.         ODBoolean needsUpdate)
  2098. {
  2099.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2100.     ODFacetMethodDebug("ODFacet","SetNeedsUpdate");
  2101.  
  2102.     _fNeedsUpdate = needsUpdate;
  2103. }
  2104.