home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / opendc12.zip / od124os2.exe / od12osr1.exe / src / DocUtils.cpp < prev    next >
C/C++ Source or Header  |  1997-03-21  |  41KB  |  1,330 lines

  1. //====START_GENERATED_PROLOG======================================
  2. //
  3. //
  4. //   COMPONENT_NAME: odutils
  5. //
  6. //   CLASSES: none
  7. //
  8. //   ORIGINS: 82,27
  9. //
  10. //
  11. //   (C) COPYRIGHT International Business Machines Corp. 1995,1996
  12. //   All Rights Reserved
  13. //   Licensed Materials - Property of IBM
  14. //   US Government Users Restricted Rights - Use, duplication or
  15. //   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  16. //       
  17. //   IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  18. //   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  19. //   PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  20. //   CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  21. //   USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  22. //   OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  23. //   OR PERFORMANCE OF THIS SOFTWARE.
  24. //
  25. //====END_GENERATED_PROLOG========================================
  26. //
  27. // @(#) 1.13 com/src/utils/DocUtils.cpp, odutils, od96os2, odos29712d 12/17/96 13:54:42 [ 3/21/97 17:20:51 ]
  28. /*
  29.     File:        DocUtils.cpp
  30.  
  31.     Contains:    code for useful high level Document/Draft utilities
  32.  
  33.     Owned by:    Tantek éelik
  34.  
  35.     Copyright:    ⌐ 1995 by Apple Computer, Inc., all rights reserved.
  36.  
  37.     
  38. */
  39.  
  40. #ifndef _DOCUTILS_
  41. #include "DocUtils.h"
  42. #endif
  43.  
  44. #ifndef SOM_ODDispatcher_xh
  45. #include "Disptch.xh"
  46. #endif
  47.  
  48. #ifndef _ODUTILS_
  49. #include <ODUtils.h>
  50. #endif
  51.  
  52. #ifndef _EXCEPT_
  53. #include "Except.h"
  54. #endif
  55.  
  56. #ifndef SOM_ODFrame_xh
  57. #include "Frame.xh"
  58. #endif
  59.  
  60. #ifndef _STDTYPIO_
  61. #include "StdTypIO.h"
  62. #endif
  63.  
  64. #ifndef _TEMPOBJ_
  65. #include "TempObj.h"
  66. #endif
  67.  
  68. #ifdef _PLATFORM_MACINTOSH_
  69. #ifndef _INFOUTIL_
  70. #include "InfoUtil.h"
  71. #endif
  72. #endif
  73.  
  74. #if !defined (_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_)
  75. #ifndef _BNDNSUTL_
  76. #include "BndNSUtl.h"
  77. #endif
  78. #endif // _PLATFORM_WIN32_
  79.  
  80. #ifndef _STORUTIL_
  81. #include "StorUtil.h"        // for GetFileContainer, code could be inline instead. -Té
  82. #endif
  83.  
  84. #ifndef _REFCTCOL_
  85. #include "RefCtCol.h"
  86. #endif
  87.  
  88.  
  89. #ifndef SOM_ODDispatcher_xh
  90. #include <Disptch.xh>
  91. #endif
  92.  
  93. #ifndef SOM_ODUndo_xh
  94. #include <Undo.xh>
  95. #endif
  96.  
  97. #ifndef SOM_ODInfo_xh
  98. #include <Info.xh>
  99. #endif
  100.  
  101. #ifndef SOM_ODClipboard_xh
  102. #include <Clipbd.xh>
  103. #endif
  104.  
  105. #ifndef SOM_ODLinkManager_xh
  106. #include <LinkMgr.xh>
  107. #endif
  108.  
  109. #ifndef SOM_ODWindowState_xh
  110. #include <WinStat.xh>
  111. #endif
  112.  
  113. #ifndef SOM_ODWindowIterator_xh
  114. #include <WinIter.xh>
  115. #endif
  116.  
  117. #ifndef SOM_ODPart_xh
  118. #include <Part.xh>
  119. #endif
  120.  
  121. #ifndef SOM_ODStorageUnit_xh
  122. #include <StorageU.xh>
  123. #endif
  124.  
  125. #ifndef SOM_ODDraft_xh
  126. #include <Draft.xh>
  127. #endif
  128.  
  129. #ifndef SOM_ODDocument_xh
  130. #include <Document.xh>
  131. #endif
  132.  
  133. #ifndef SOM_ODContainer_xh
  134. #include <ODCtr.xh>
  135. #endif
  136.  
  137. #ifndef _TIME
  138. #include <time.h>
  139. #endif
  140.  
  141. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  142. #include <StdTypes.xh>
  143. #endif
  144.  
  145. #ifndef SOM_Module_OpenDoc_StdProps_defined
  146. #include <StdProps.xh>
  147. #endif
  148.  
  149. #ifndef SOM_ODSession_xh
  150. #include <ODSessn.xh>
  151. #endif
  152.  
  153.  
  154. #ifndef SOM_ODObjectNameSpace_xh
  155. #include "ObjectNS.xh"
  156. #endif
  157.  
  158. #ifndef SOM_ODNameSpaceManager_xh
  159. #include <NmSpcMg.xh>
  160. #endif
  161.  
  162. #ifndef SOM_ODObjectIterator_xh
  163. #include <ObjctItr.xh>
  164. #endif
  165.  
  166.  
  167. #ifndef _NMSPCUTL_
  168. #include <NmSpcUtl.h>
  169. #endif
  170.  
  171. #if ( !defined(_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  172.       && !defined(_PLATFORM_AIX_)
  173. #ifndef __TOOLUTILS__
  174. #include <ToolUtils.h>
  175. #endif
  176.  
  177. #ifndef __ICONS__
  178. #include <Icons.h>
  179. #endif
  180.  
  181. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2_ && !_PLATFORM_AIX_
  182.  
  183. #ifndef _ODDEBUG_
  184. #include "ODDebug.h"
  185. #endif
  186.  
  187. #ifdef _PLATFORM_WIN32_
  188. #define watchCursor 4
  189.  
  190. #ifndef _WINUSER_
  191. #include <WINUSER.H>
  192. #endif 
  193.  
  194. #endif
  195.  
  196. //==============================================================================
  197. // Constants
  198. //==============================================================================
  199.  
  200. const ODISOStr        kODRefNumDocument            =    "RefNumDocument";
  201. const ODISOStr        kODDocumentTempDraft        =    "DocumentTempDraft";
  202.  
  203. const  ODPropertyName kODPropUnsavedDocument    =    "+//ISO 9070/ANSI::113722::US::CI LABS::OpenDoc:Property:UnsavedDocument";
  204. const  ODPropertyName kODPropTempDocument        =    "+//ISO 9070/ANSI::113722::US::CI LABS::OpenDoc:Property:TempDocument";
  205.  
  206.  
  207. static ODUByte gDUHex[] = "0123456789ABCDEF";
  208.  
  209. /* Constants to specify the file fork GetLocalPaths should match */
  210. enum
  211. {
  212.     kDataFork        = 0,
  213.     kResourceFork    = 1
  214. };
  215.  
  216. //==============================================================================
  217. // Local functions
  218. //==============================================================================
  219.  
  220. ODISOStr    ODCreateISOStrKeyFromULong(ODULong    uLongKey);
  221.  
  222. ODULong        ODGetODULongFromISOStrKey(ODISOStr isoStrKey);
  223.  
  224. void        SyncFileToProperties(Environment* ev, ODSession* session, ODDocument* document);
  225. void        SyncPropertiesToFile(Environment* ev, ODSession* session, ODDocument* document);
  226.  
  227. ODFileRefNum    ODDeduceRefNum(Environment* ev, PlatformFile* file, 
  228.                     ODULong prevRefNumCount, ODSShort* prevRefNums);
  229.                     
  230. //------------------------------------------------------------------------------
  231. // Namespace key utilities
  232. //------------------------------------------------------------------------------
  233.  
  234. ODISOStr    ODCreateISOStrKeyFromULong(ODULong    uLongKey)
  235. {
  236.     ODISOStr ret = (ODISOStr)ODNewPtrClear(sizeof(ODULong)*2 + 1);
  237.     for (ODUByte i = 0; i<sizeof(ODULong); ++i)
  238.     {
  239.         ODUByte b = ((ODUByte*)(&uLongKey))[i];
  240.         ret[i*2] = gDUHex[b / 16];
  241.         ret[i*2 + 1] = gDUHex[b % 16];
  242.     }
  243.     return ret;
  244. }
  245.  
  246.  
  247. ODULong        ODGetODULongFromISOStrKey(ODISOStr isoStrKey)
  248. {
  249.     ODULong ret;
  250.     for (ODUByte i = 0; i<sizeof(ODULong); ++i)
  251.     {
  252.         ODUByte n1 = 0, n2 = 0;
  253.         n1 = isoStrKey[i*2];
  254.         n2 = isoStrKey[i*2+1];
  255.         if (n1>'9') 
  256.             n1=n1-'A'+10;
  257.         else 
  258.             n1=n1-'0';
  259.         if (n2>'9') 
  260.             n2=n2-'A'+10;
  261.         else 
  262.             n2=n2-'0';
  263.         
  264.         ((ODUByte*)(&ret))[i] = n1*16 + n2;
  265.     }
  266.     return ret;
  267. }
  268.  
  269.  
  270. #if ( !defined (_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  271.      && !defined(_PLATFORM_AIX_)
  272. //------------------------------------------------------------------------------
  273. // ODDeduceRefNum
  274. //------------------------------------------------------------------------------
  275.  
  276. ODFileRefNum    ODDeduceRefNum(Environment* ev, PlatformFile* file, 
  277.                     ODULong prevRefNumCount, ODSShort* prevRefNums)
  278. {
  279.     ODFileRefNum    retval = 0;
  280.     ODULong         newRefNumCount = 0;
  281.     ODSShort*         newRefNums = kODNULL;
  282.     file->GetLocalPaths(kDataFork, &newRefNumCount, &newRefNums);
  283.  
  284.     WASSERT(newRefNumCount == prevRefNumCount + 1);
  285.  
  286.     ODULong i = 0,j;
  287.     ODBoolean found = kODFalse;
  288.     
  289.     while  (i<newRefNumCount)
  290.     {
  291.         j = 0;
  292.         while (j<prevRefNumCount && (found = (newRefNums[i] == prevRefNums[j]))==kODFalse)
  293.             ++j;
  294.         if (!found)
  295.             break;
  296.         ++i;
  297.     }
  298.     
  299.     WASSERT(i<newRefNumCount);
  300.     
  301.     retval = newRefNums[i];
  302.     
  303.     if (newRefNums) 
  304.         ODDisposePtr((Ptr)newRefNums);
  305.     
  306.     return retval;
  307. }
  308.  
  309.  
  310.  
  311. //==============================================================================
  312. // Opening an file/container/document/draft
  313. //==============================================================================
  314.  
  315.  
  316. void ODAcquireCtrDocTopDraft(Environment* ev, ODSession* session,PlatformFile* file,
  317.         ODContainer** container, ODDocument** document, ODDraft** draft)
  318. {
  319.     *container = GetFileContainer(ev, session, &(file->GetFileSpec()));
  320.     *document = (*container)->AcquireDocument(ev,kODDefaultDocument);
  321.     *draft = (*document)->AcquireDraft(ev,kODDPReadOnly,0,kODNULL,kODPosTop,kODFalse);
  322. }
  323.  
  324. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2 && !_PLATFORM_AIX
  325.  
  326. //------------------------------------------------------------------------------
  327. // ODGetFirstOpenDocument
  328. //------------------------------------------------------------------------------
  329.  
  330. ODDocument*    ODGetFirstOpenDocument(Environment* ev, ODSession* session)
  331. {
  332.     return ODGetNthOpenDocument(ev, session, 1);
  333. }
  334.                 
  335. //------------------------------------------------------------------------------
  336. // ODGetNthOpenDocument
  337. //
  338. // n is 1 based & returns kODNULL if there is no nth document
  339. //------------------------------------------------------------------------------
  340.  
  341. ODDocument*    ODGetNthOpenDocument(Environment* ev, ODSession* session, ODULong n)
  342. {
  343.     WASSERT(session != kODNULL);
  344.     
  345.     if (!session)
  346.         THROW(kODErrIllegalNullInput);
  347.         
  348.     ODNameSpaceManager* theNameSpaceManager = session->GetNameSpaceManager(ev);
  349.     ODObjectNameSpace* refNumDocumentNameSpace = 
  350.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  351.                                                         kODRefNumDocument);
  352.     RETURN_IF_NULL(refNumDocumentNameSpace, kODNULL);
  353.     
  354.     ODObjectIterator* iter = refNumDocumentNameSpace->CreateIterator(ev);
  355.     ODDocument* document = kODNULL;
  356.     ODISOStr unusedKey = kODNULL;
  357.     ODULong unusedObjectLength;
  358.     iter->First(ev, &unusedKey, (ODObject**)&document, &unusedObjectLength);
  359.     while (--n > 0 && document != kODNULL)
  360.     {
  361.         ODDisposePtr(unusedKey);
  362.         unusedKey = kODNULL;
  363.         document = kODNULL;
  364.         iter->Next(ev, &unusedKey, (ODObject**)&document, &unusedObjectLength);
  365.     }
  366.     ODDisposePtr(unusedKey);
  367.     ODDeleteObject(iter);
  368.     return document;
  369. }
  370.                 
  371. #if !defined (_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_)
  372. //------------------------------------------------------------------------------
  373. // ODGetOpenDocumentFromRefNum
  374. //------------------------------------------------------------------------------
  375.  
  376. ODDocument*    ODGetOpenDocumentFromRefNum(Environment* ev, ODSession* session,
  377.                 ODFileRefNum refnum)
  378. {
  379.     WASSERT(session != kODNULL);
  380.  
  381.     if (!session)
  382.         THROW(kODErrIllegalNullInput);
  383.         
  384.     ODNameSpaceManager* theNameSpaceManager = session->GetNameSpaceManager(ev);
  385.     ODObjectNameSpace* refNumDocumentNameSpace = 
  386.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  387.                                                         kODRefNumDocument);
  388.     RETURN_IF_NULL(refNumDocumentNameSpace, kODNULL);
  389.     ODDocument* document = kODNULL;
  390.     TempODISOStr    key = ODCreateISOStrKeyFromULong(refnum);
  391.     refNumDocumentNameSpace->GetEntry(ev, key, (ODObject**)&document);
  392.     return document;
  393. }
  394. #endif // _PLATFORM_WIN32_
  395.                 
  396. //------------------------------------------------------------------------------
  397. // ODGetTempDraftFromOpenDocument
  398. //------------------------------------------------------------------------------
  399.                 
  400. ODDraft*    ODGetTempDraftFromOpenDocument(Environment* ev, ODSession* session,
  401.                 ODDocument* document)
  402. {
  403.     RETURN_IF_NULL(document, kODNULL);
  404.  
  405.     WASSERT(session != kODNULL);
  406.     if (!session)
  407.         THROW(kODErrIllegalNullInput);
  408.         
  409.     ODNameSpaceManager* theNameSpaceManager = session->GetNameSpaceManager(ev);
  410.  
  411.     ODObjectNameSpace* documentTempDraftNameSpace = 
  412.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  413.                                                         kODDocumentTempDraft);
  414.     RETURN_IF_NULL(documentTempDraftNameSpace, kODNULL);
  415.     ODDraft* draft = kODNULL;
  416.     TempODISOStr    key = ODCreateISOStrKeyFromULong((ODULong)document);
  417.     documentTempDraftNameSpace->GetEntry(ev, key, (ODObject**)&draft);
  418.     return draft;
  419. }
  420.  
  421. //------------------------------------------------------------------------------
  422. // ODTempDraftCreated
  423. //------------------------------------------------------------------------------
  424.                 
  425. void    ODTempDraftCreated(Environment* ev, ODSession* session, 
  426.             ODDocument* document, ODDraft* tempDraft)
  427. {
  428.     WASSERT(session != kODNULL);
  429.     WASSERT(document != kODNULL);
  430.     WASSERT(tempDraft != kODNULL);
  431.  
  432.     if (!session)
  433.         THROW(kODErrIllegalNullInput);
  434.     if (!document)
  435.         THROW(kODErrIllegalNullDocumentInput);
  436.     if (!tempDraft)
  437.         THROW(kODErrIllegalNullDraftInput);
  438.         
  439.     ODNameSpaceManager* theNameSpaceManager = session->GetNameSpaceManager(ev);
  440.  
  441.     ODObjectNameSpace* nameSpace =    
  442.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  443.                                                         kODDocumentTempDraft);
  444.     if (!nameSpace)
  445.     {
  446.         nameSpace = 
  447.             (ODObjectNameSpace*)theNameSpaceManager->CreateNameSpace(
  448.                 ev, kODDocumentTempDraft, kODNULL, 5, kODNSDataTypeODObject);
  449.     }
  450.     
  451.     {
  452.         TempODISOStr key = ODCreateISOStrKeyFromULong((ODULong)document);
  453.         ODDraft* unusedDraft;
  454.         if (nameSpace->GetEntry(ev, key, (ODObject**)&unusedDraft))
  455.             nameSpace->Unregister(ev, key);
  456.         nameSpace->Register(ev, key, tempDraft);
  457.     }
  458. }
  459.  
  460. //------------------------------------------------------------------------------
  461. // ODDocumentOpened
  462. //------------------------------------------------------------------------------
  463.                 
  464. void        ODDocumentOpened(Environment* ev, ODSession* session,
  465.                 ODFileRefNum refnum, ODDocument* document, ODDraft* tempDraft)
  466. {
  467.     WASSERT(session != kODNULL);
  468.     WASSERT(document != kODNULL);
  469.  
  470.     if (!session)
  471.         THROW(kODErrIllegalNullInput);
  472.     if (!document)
  473.         THROW(kODErrIllegalNullDocumentInput);
  474.         
  475.     ODNameSpaceManager* theNameSpaceManager = session->GetNameSpaceManager(ev);
  476.  
  477.     document->Acquire(ev);    // Balanced by Release in ODDocumentClosed.
  478.     document->GetContainer(ev)->Acquire(ev); // Balanced by Release in ODDocumentClosed.
  479.  
  480.     //Ñ it's not clear whether ODDocumentClosed needs to be called if this fn fails.
  481.     //Ñ Failure halfway through leaves things in an inconsistent state and it doesn't
  482.     //Ñ look like there's any way to clean up fully.
  483.  
  484.     ODObjectNameSpace* nameSpace = 
  485.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  486.                                                         kODRefNumDocument);
  487.     if (!nameSpace)
  488.     {
  489.         nameSpace = 
  490.             (ODObjectNameSpace*)theNameSpaceManager->CreateNameSpace(
  491.                 ev, kODRefNumDocument, kODNULL, 5, kODNSDataTypeODObject);
  492.     }
  493.     
  494.     {
  495.         TempODISOStr key = ODCreateISOStrKeyFromULong((ODULong)refnum);
  496. #if ODDebug
  497.         ODDocument* unusedDocument;
  498.         if (nameSpace->GetEntry(ev, key, (ODObject**)&unusedDocument))
  499.             WARNMSG(WARN_INDEX(0),"refnum already in kODRefNumDocument namespace!");
  500. #endif
  501.         nameSpace->Register(ev, key, document);
  502.     }
  503.     
  504.     if (tempDraft)
  505.         ODTempDraftCreated(ev, session, document, tempDraft);
  506. }
  507.                 
  508. //------------------------------------------------------------------------------
  509. // ODDocumentClosed
  510. //------------------------------------------------------------------------------
  511.                 
  512. void    ODDocumentClosed(Environment* ev, ODSession* session,
  513.                 ODDocument* document)
  514. {
  515.     WASSERT(session != kODNULL);
  516.     WASSERT(document != kODNULL);
  517.  
  518.     if (!session)
  519.         THROW(kODErrIllegalNullInput);
  520.     if (!document)
  521.         THROW(kODErrIllegalNullDocumentInput);
  522.         
  523.     ODNameSpaceManager* theNameSpaceManager = session->GetNameSpaceManager(ev);
  524.     ODObjectNameSpace* nameSpace;
  525.     
  526.     nameSpace = 
  527.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  528.                                                     kODDocumentTempDraft);
  529.     if (nameSpace)
  530.     {
  531.         TempODISOStr key = ODCreateISOStrKeyFromULong((ODULong)document);
  532.         ODDraft* unusedDraft;
  533.         if (nameSpace->GetEntry(ev, key, (ODObject**)&unusedDraft))
  534.             nameSpace->Unregister(ev, key);
  535.     }
  536.     
  537.     nameSpace = 
  538.         (ODObjectNameSpace*)theNameSpaceManager->HasNameSpace( ev, 
  539.                                                         kODRefNumDocument);
  540.     if (!nameSpace)
  541.         return;
  542.  
  543.     ODDocument* entryDocument = kODNULL;
  544.     ODISOStr key = kODNULL;
  545.     ODULong unusedObjectLength;
  546.     ODObjectIterator* iter = nameSpace->CreateIterator(ev);
  547.     for (iter->First(ev, &key, (ODObject**)&entryDocument, &unusedObjectLength);
  548.          iter->IsNotComplete(ev);
  549.          iter->Next(ev, &key, (ODObject**)&entryDocument, &unusedObjectLength))
  550.     {
  551.         TempODISOStr tempKey = key; // DMc: ensure it's deleted
  552.         if (ODObjectsAreEqual(ev, document, entryDocument))
  553.         {
  554.             nameSpace->Unregister(ev, key);
  555.             ODContainer* container = document->GetContainer(ev);
  556.             ODFinalReleaseObject(ev, document);
  557.             ODFinalReleaseObject(ev, container);
  558.             break;
  559.         }
  560.     }
  561.     ODDeleteObject(iter);
  562. }
  563.  
  564.  
  565. //==============================================================================
  566. // Root Part/StorageUnit
  567. //==============================================================================
  568.  
  569. //------------------------------------------------------------------------------
  570. // ODAcquireRootPartOfDraft
  571. //------------------------------------------------------------------------------
  572.  
  573. ODPart* ODAcquireRootPartOfDraft(Environment* ev, ODDraft* draft)
  574. {
  575.     if (!draft)
  576.         THROW(kODErrIllegalNullDraftInput);
  577.         
  578.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  579.     return draft->
  580.         AcquirePart(ev,ODGetStrongSURefProp(ev, su, kODPropRootPartSU, kODStrongStorageUnitRef));
  581. }
  582.  
  583. //------------------------------------------------------------------------------
  584. // ODAcquireRootPartSUOfDraft
  585. //------------------------------------------------------------------------------
  586.  
  587. ODStorageUnit* ODAcquireRootPartSUOfDraft(Environment* ev, ODDraft* draft)
  588. {
  589.     if (!draft)
  590.         THROW(kODErrIllegalNullDraftInput);
  591.         
  592.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  593.     if (!su->Exists(ev, kODPropRootPartSU, kODStrongStorageUnitRef, 0))
  594.         return kODNULL;
  595.         
  596.     return draft->
  597.         AcquireStorageUnit(ev,ODGetStrongSURefProp(ev, su, kODPropRootPartSU, kODStrongStorageUnitRef));
  598. }
  599.  
  600. //------------------------------------------------------------------------------
  601. // ODSetRootPartSUOfDraft
  602. //------------------------------------------------------------------------------
  603.  
  604. void ODSetRootPartSUOfDraft(Environment* ev, ODDraft* draft, ODStorageUnit* rootPartSU)
  605. {
  606.     if (!draft)
  607.         THROW(kODErrIllegalNullDraftInput);
  608.     if (!rootPartSU)
  609.         THROW(kODErrIllegalNullStorageUnitInput);
  610.         
  611.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  612.     ODSetStrongSURefProp(ev, su, kODPropRootPartSU, kODStrongStorageUnitRef,
  613.                         rootPartSU->GetID(ev));
  614. }
  615.  
  616. //------------------------------------------------------------------------------
  617. // ODGetDraftOfWindow
  618. //  Given a window object, get the root part's storageUnit's draft
  619. //------------------------------------------------------------------------------
  620.  
  621. ODDraft* ODGetDraftOfWindow(Environment* ev, ODWindow* window)
  622. {
  623.     RETURN_IF_NULL(window, kODNULL);
  624.         
  625.     TempODPart part = window->GetRootFrame(ev)->AcquirePart(ev);
  626.     return part->GetStorageUnit(ev)->GetDraft(ev);
  627. }
  628.  
  629. #if ( !defined(_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  630.       && !defined(_PLATFORM_AIX_)
  631. //------------------------------------------------------------------------------
  632. // ODResetDateModByInfo
  633. //------------------------------------------------------------------------------
  634.  
  635. void ODResetDateModByInfo(Environment* ev, ODStorageUnit* su)
  636. {
  637.     WASSERT(su != kODNULL);
  638.     if (!su)
  639.         THROW(kODErrIllegalNullStorageUnitInput);
  640.  
  641.     WASSERT(HAS_WRITE_ACCESS(su->GetDraft(ev)->GetPermissions(ev)));
  642.             
  643.     ODTime dateTime;
  644.     time((time_t *)(&dateTime));
  645.     ODSetCreationDate(ev, su, dateTime);
  646.     ODSetModificationDate(ev, su, dateTime);
  647.     
  648.     ODIText        modBy;
  649.     su->GetSession(ev)->GetUserName(ev, &modBy);
  650.     TRY
  651.         ODSetModifiedBy(ev, su, &modBy);
  652.     CATCH_ALL
  653.         DisposeITextStruct(modBy);
  654.         RERAISE;
  655.     ENDTRY
  656.     DisposeITextStruct(modBy);
  657.     
  658.     TempODStorageUnit    rootSU = ODAcquireRootPartSUOfDraft(ev, su->GetDraft(ev));
  659.     if (ODObjectsAreEqual(ev, su, rootSU))
  660.     {
  661.         TempPlatformFile    file = GetPlatformFileFromContainer(ev, 
  662.             su->GetDraft(ev)->GetDocument(ev)->GetContainer(ev));
  663.         TempODName             partname = file->GetName();
  664.         //ODSetPOName(ev, rootPart, partname); // don't want to have to have the part so╔
  665. #if (defined _PLATFORM_WIN32_ || defined _PLATFORM_UNIX_ || defined _PLATFORM_OS2_)
  666.         ODSetITextProp(ev, su, kODPropName, kODPlatformIText, partname);
  667. #elif defined(_PLATFORM_MACINTOSH_)
  668.         ODSetITextProp(ev, su, kODPropName, kODMacIText, partname);
  669. #endif
  670.     }
  671. }
  672.  
  673. //------------------------------------------------------------------------------
  674. // ODGetDocumentFileName
  675. //------------------------------------------------------------------------------
  676.  
  677. void ODGetDocumentFileName(Environment* ev, ODDocument* document, char* fileName)
  678. {
  679.     TempPlatformFile    file = GetPlatformFileFromContainer(ev, document->GetContainer(ev));
  680.     file->GetAsciiName(fileName, 255);
  681. }
  682. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2_ && !_PLATFORM_AIX_
  683.  
  684. //==============================================================================
  685. // Cursor Utils
  686. //==============================================================================
  687.  
  688. void WatchCursor()
  689. {
  690. #ifdef _PLATFORM_WIN32_
  691.     SetCursor(LoadCursor(NULL, IDC_WAIT));
  692. #elif _PLATFORM_MACINTOSH_
  693.     SetCursor(*GetCursor(watchCursor));
  694. #endif // _PLATFORM_WIN32_
  695. }
  696.  
  697. void ArrowCursor()
  698. {
  699. #ifdef _PLATFORM_WIN32_
  700.     SetCursor(LoadCursor(NULL, IDC_ARROW));
  701. #elif _PLATFORM_MACINTOSH_
  702.     SetCursor(&(ODQDGlobals.arrow));
  703. #endif // _PLATFORM_WIN32_
  704. }
  705.  
  706. //==============================================================================
  707. // Active/Changed Utils
  708. //==============================================================================
  709.  
  710. ODWindow*    ODAcquireActiveWindow(Environment* ev, ODSession* session)
  711. {
  712.     WASSERT(session != kODNULL);
  713.     if (!session)
  714.         THROW(kODErrIllegalNullInput);
  715.         
  716.     return session->GetWindowState(ev)->AcquireActiveWindow(ev);
  717. }
  718.  
  719. ODDraft*    ODGetActiveDraft(Environment* ev, ODSession* session)
  720. {
  721.     TempODWindow window = ODAcquireActiveWindow(ev, session);
  722.     return ODGetDraftOfWindow(ev, window);
  723. }
  724.  
  725. ODDocument*    ODGetActiveDocument(Environment* ev, ODSession* session)
  726. {
  727.     ODDraft* draft = ODGetActiveDraft(ev, session);
  728.     RETURN_IF_NULL(draft, kODNULL);    
  729.     
  730.     return draft->GetDocument(ev);
  731. }
  732.  
  733. ODBoolean    ODDocumentHasChanges(Environment* ev, ODSession* session,
  734.                 ODDocument* document)
  735. {
  736.     ODDraft* draft = ODGetTempDraftFromOpenDocument(ev, session, document);
  737.     RETURN_IF_NULL(draft, kODFalse);    
  738.  
  739.     return draft->ChangedFromPrev(ev);
  740. }
  741.  
  742. ODBoolean    ODDocumentHasWriteAccess(Environment* ev, ODSession* session,
  743.                 ODDocument* document)
  744. {
  745.     return ODDraftHasWriteAccess(ev, ODGetTempDraftFromOpenDocument(ev, session, document));
  746. }
  747.  
  748.  
  749. ODBoolean ODDraftHasWriteAccess(Environment* ev, ODDraft* draft)
  750. {
  751.     RETURN_IF_NULL(draft, kODFalse);    
  752.     
  753.     return HAS_WRITE_ACCESS(draft->GetPermissions(ev));
  754. }
  755.  
  756. //==============================================================================
  757. // User level document operations
  758. //==============================================================================
  759.  
  760. //------------------------------------------------------------------------------
  761. // ODNewDocument
  762. //------------------------------------------------------------------------------
  763.  
  764. #define    kODErrEditorLibraryNotFound                -29816
  765. // error code copied from the Shell (RlShlDef.h)
  766.  
  767. #if ( !defined(_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  768.       && !defined(_PLATFORM_AIX_)
  769. void ODNewDocument(Environment* ev, ODContainer* container,
  770.                             ODType        rootPartKind,
  771.                             ODEditor    rootPartEditor)
  772. {
  773.     TempODDocument    document = container->AcquireDocument(ev, kODDefaultDocument);
  774.     TempODDraft        draft = document->AcquireBaseDraft(ev, kODDPExclusiveWrite);
  775.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  776.  
  777.     ODResetDateModByInfo(ev, su);    
  778.     
  779.   // create new root part
  780.       TempODPart rootPart = kODNULL;
  781.       
  782.       TRY
  783.         rootPart = draft->CreatePart(ev, rootPartKind, rootPartEditor);
  784.     CATCH_ALL
  785.         if (ErrorCode()==fragLibNotFound)
  786.             THROW(kODErrEditorLibraryNotFound);
  787.         else
  788.             RERAISE;
  789.     ENDTRY
  790.     ODStorageUnit* partSU = rootPart->GetStorageUnit(ev);
  791.     if (partSU == kODNULL)
  792.         THROW(kODErrEditorLibraryNotFound);
  793.     ODSetRootPartSUOfDraft(ev, draft, partSU);
  794.  
  795.     ODSetBooleanProp(ev, su, kODPropUnsavedDocument, kODBoolean, kODTrue);
  796.  
  797.     draft->Externalize(ev);
  798.  
  799.     ODPlatformType    rootPartOSType = ODGetIconFilePlatformTypeFromPartSU(ev, partSU);
  800.  
  801.     TempPlatformFile file = GetPlatformFileFromContainer(ev, container);
  802.     file->SetPlatformType(rootPartOSType);
  803. }
  804. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2 && !_PLATFORM_AIX
  805.  
  806. //------------------------------------------------------------------------------
  807. // ODIsUnsavedNewDocument
  808. //------------------------------------------------------------------------------
  809.  
  810. ODBoolean ODIsUnsavedNewDocument(Environment* ev, ODSession* session, ODDocument* document)
  811. {
  812.     ODDraft* draft = ODGetTempDraftFromOpenDocument(ev, session, document);
  813.     RETURN_IF_NULL(draft, kODFalse);
  814.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  815.     if (!su->Exists(ev, kODPropUnsavedDocument, kODBoolean, 0))
  816.         return kODFalse;
  817.     return ODGetBooleanProp(ev, su, kODPropUnsavedDocument, kODBoolean);
  818. }
  819.  
  820. //------------------------------------------------------------------------------
  821. // ODSetIsUnsavedNewDocument
  822. //------------------------------------------------------------------------------
  823.  
  824. void ODSetIsUnsavedNewDocument(Environment* ev, ODDraft* draft)
  825. {
  826.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  827.     ODSetBooleanProp(ev, su, kODPropUnsavedDocument, kODBoolean, kODTrue);
  828. }
  829.  
  830. //------------------------------------------------------------------------------
  831. // ODOpenFileDocument
  832. //------------------------------------------------------------------------------
  833.  
  834. #if ( !defined (_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  835.      && !defined(_PLATFORM_AIX_)
  836.  
  837. ODDraft* ODOpenFileDocument(Environment* ev, ODSession* session, PlatformFile* file,
  838.     ODDraftPermissions permissions)
  839. {
  840.     WASSERT(session != kODNULL);
  841.     WASSERT(file != kODNULL);
  842.  
  843.     if (!session)
  844.         THROW(kODErrIllegalNullInput);
  845.     if (!file)
  846.         THROW(kODErrIllegalNullInput);
  847.  
  848.     ODContainer*    container    = kODNULL;
  849.     ODDocument*        document    = kODNULL;
  850.     ODDraft*        currentdraft    = kODNULL;
  851.     ODDraft*        tempdraft    = kODNULL;
  852.     
  853.     ODULong refNumCount, i;
  854.     ODSShort* refNums = kODNULL;
  855.     file->GetLocalPaths(kDataFork, &refNumCount, &refNums);
  856.     
  857.     for ( i=0; i<refNumCount; ++i)
  858.         if ((document = ODGetOpenDocumentFromRefNum(ev, session, refNums[i])) != kODNULL)
  859.         {
  860.             currentdraft = ODGetTempDraftFromOpenDocument(ev, session, document);
  861.             if (currentdraft)
  862.                 currentdraft->Acquire(ev);
  863.             else
  864.                 currentdraft = document->AcquireDraft(ev,kODDPReadOnly,0,kODNULL,kODPosTop,kODFalse);
  865.             if (refNums)
  866.                 ODDisposePtr(refNums);
  867.             return currentdraft;
  868.         }
  869.  
  870.     // ODAcquireCtrDocTopDraft opens the file and adds a new refnum.
  871.  
  872.     ODAcquireCtrDocTopDraft(ev, session, file, &container, &document, ¤tdraft);
  873.     TempODContainer tempCont = container;        // Ensures they're released
  874.     TempODDocument  tempDoc  = document;
  875.     ODFileRefNum    refnum = ODDeduceRefNum(ev, file, refNumCount, refNums);
  876.     if (refNums)
  877.         ODDisposePtr(refNums);
  878.     
  879.     if (HAS_WRITE_ACCESS(permissions) && !file->IsLocked())
  880.     {
  881.         currentdraft = 
  882.             document->AcquireDraft(ev, permissions,0, currentdraft, kODPosSame, kODTrue);
  883.         currentdraft = document->CreateDraft(ev, currentdraft, kODTrue);
  884.         tempdraft = currentdraft;
  885.         tempdraft->Acquire(ev); 
  886.             // Because "The caller is responsible for properly refcounting the tempdraft."
  887.             // From DocUtils.h documentation of ODDocumentOpened.
  888.     }
  889.             
  890.     ODDocumentOpened(ev, session, refnum, document, tempdraft);
  891.     
  892.     return currentdraft;
  893. }
  894.  
  895. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2_ && !_PLATFORM_AIX_
  896. //------------------------------------------------------------------------------
  897. // ODOpenDraft
  898. //------------------------------------------------------------------------------
  899.  
  900. void ODOpenDraft(Environment* ev, ODSession* session, ODDraft* draft)
  901. {
  902.     WASSERT(session != kODNULL);
  903.     WASSERT(draft != kODNULL);
  904.  
  905.     if (!session)
  906.         THROW(kODErrIllegalNullInput);
  907.     if (!draft)
  908.         THROW(kODErrIllegalNullDraftInput);
  909.  
  910.     ODBoolean    windowsOpen = kODFalse;
  911.     ODWindowState* windowState = session->GetWindowState(ev);
  912.  
  913.     windowState->Internalize(ev,draft);
  914.     windowState->OpenWindows(ev, draft);
  915.     windowsOpen = (windowState->GetRootWindowCount(ev, draft)>0);
  916.  
  917.     //need this for NoPart alert 
  918.     if (session->GetDispatcher(ev)->ShouldExit(ev))
  919.         return;
  920.         
  921.     if (!windowsOpen)
  922.     {
  923.         TempODPart    rootPart = ODAcquireRootPartOfDraft(ev, draft);
  924.         rootPart->Open(ev, kODNULL);
  925.         windowState->SetDefaultWindowTitles(ev, draft);
  926.     }
  927.     session->GetLinkManager(ev)->DraftOpened(ev,draft);
  928. }
  929.  
  930. //------------------------------------------------------------------------------
  931. // ODCloseDraft
  932. //------------------------------------------------------------------------------
  933.  
  934. void ODCloseDraft(Environment* ev, ODSession* session, ODDraft* draft)
  935. {
  936.     WASSERT(session != kODNULL);
  937.     WASSERT(draft != kODNULL);
  938.  
  939.     if (!session)
  940.         THROW(kODErrIllegalNullInput);
  941.     if (!draft)
  942.         THROW(kODErrIllegalNullDraftInput);
  943.         
  944.     session->GetLinkManager(ev)->DraftClosing(ev, draft);
  945.     session->GetUndo(ev)->ClearActionHistory(ev, kODDontRespectMarks);
  946.     session->GetClipboard(ev)->DraftClosing(ev, draft);
  947.     session->GetWindowState(ev)->CloseWindows(ev, draft);
  948. }
  949.  
  950. //------------------------------------------------------------------------------
  951. // ODCloseDocument
  952. //------------------------------------------------------------------------------
  953.  
  954. ODBoolean ODCloseDocument(Environment* ev, ODSession* session, ODDocument* document)
  955. {
  956.     RETURN_IF_NULL(document, kODFalse);    // For the caller's convenience.
  957.  
  958.     ODDraft* tempDraft = ODGetTempDraftFromOpenDocument(ev, session, document);
  959.  
  960.     ODRefCntCollection*    draftsWithOpenWindows = new ODRefCntCollection(ev);
  961.  
  962.     ODWindowIterator* iter = session->GetWindowState(ev)->CreateWindowIterator(ev);
  963.     ODWindow* window = kODNULL;
  964.     while ((window = iter->Next(ev)) != kODNULL)
  965.     {
  966.         // close all windows whose draft's document = document
  967.         ODDraft* draft = ODGetDraftOfWindow(ev, window);
  968.         WASSERT(draft != kODNULL);
  969.         if (ODObjectsAreEqual(ev, document, draft->GetDocument(ev))
  970.             && !draftsWithOpenWindows->Contains(draft))
  971.             draftsWithOpenWindows->AddFirstAndAcquire(draft);
  972.     }
  973.     ODDeleteObject(iter);
  974.  
  975.     ODDraft* draft = kODNULL;
  976.     while ((draft = (ODDraft*)draftsWithOpenWindows->RemoveFirst()) != kODNULL)
  977.     {
  978.         ODCloseDraft(ev, session, draft);
  979.         draft->Release(ev); // to balance AddFirstAndAcquire above.
  980.     }
  981.  
  982.     ODDeleteObject(draftsWithOpenWindows);
  983.     if (tempDraft)
  984.     {
  985.         tempDraft->RemoveChanges(ev);
  986.         WASSERT(tempDraft->GetRefCount(ev) == 1);
  987.         tempDraft->RemoveFromDocument(ev);
  988.     }
  989.     ODDocumentClosed(ev, session, document);
  990.     
  991.     TempODWindow activeWindow = ODAcquireActiveWindow(ev, session);
  992.     return (activeWindow == kODNULL);
  993. }
  994.  
  995. //------------------------------------------------------------------------------
  996. // ODReleaseCloseWindow
  997. //------------------------------------------------------------------------------
  998.  
  999. ODBoolean ODReleaseCloseWindow(Environment* ev, ODSession* session, ODWindow* window)
  1000. {
  1001.     WASSERT(session != kODNULL);
  1002.     WASSERT(window != kODNULL);
  1003.  
  1004.     if (!session)
  1005.         THROW(kODErrIllegalNullInput);
  1006.     if (!window)
  1007.         THROW(kODErrIllegalNullInput);
  1008.  
  1009.     WASSERT(window->GetRefCount(ev) > 1);
  1010. #if ODDebug
  1011.     ODULong windowRefCount = window->GetRefCount(ev);
  1012.     if (windowRefCount != 3)
  1013.     {
  1014.         WARNMSG(WARN_INDEX(0),"Trying to close a window with RefCount of (%d) != 3.", windowRefCount);
  1015.         WARNMSG(WARN_INDEX(0),"╔expect problems later closing the draft, document and container.-Té");
  1016.         WARNMSG(WARN_INDEX(0),"Solution? Make sure window is properly refcounted.");
  1017.         WARNMSG(WARN_INDEX(0),"Possible Culprit: Part::Open forgetting to release a registered window.");
  1018.     }
  1019. #endif
  1020.     
  1021.     ODBoolean wasLastRootWindow = kODFalse;
  1022.     ODDraft* draft = ODGetDraftOfWindow(ev, window);
  1023.     draft->Acquire(ev);    // necessary just in case closing all windows fully releases the draft
  1024.     ODBoolean isOnlyDraftWindow 
  1025.         = window->IsRootWindow(ev) && 
  1026.         (session->GetWindowState(ev)->GetRootWindowCount(ev, draft) == 1);
  1027.     if (isOnlyDraftWindow)
  1028.     {
  1029.         window->Release(ev);
  1030.         ODCloseDraft(ev, session, draft);
  1031.  
  1032.         ODDocument* document = draft->GetDocument(ev);
  1033.         if (!document->Exists(ev, kODNULLID, draft, kODPosFirstAbove))
  1034.         {
  1035.             ODReleaseObject(ev, draft); // to balance the above Acquire before calling ODCloseDocument.
  1036.             wasLastRootWindow = ODCloseDocument(ev, session, document);
  1037.         }
  1038.     }
  1039.     else
  1040.     {
  1041.         window->CloseAndRemove(ev);
  1042.     }
  1043.     ODReleaseObject(ev, draft);
  1044.     return wasLastRootWindow;
  1045. }
  1046.  
  1047. #if ( !defined (_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  1048.      && !defined(_PLATFORM_AIX_)
  1049. //------------------------------------------------------------------------------
  1050. // ODDeleteDocument
  1051. //------------------------------------------------------------------------------
  1052.  
  1053. ODBoolean ODDeleteDocument(Environment* ev, ODSession* session, ODDocument* document)
  1054. {
  1055.     WASSERT(session != kODNULL);
  1056.     WASSERT(document != kODNULL);
  1057.  
  1058.     if (!session)
  1059.         THROW(kODErrIllegalNullInput);
  1060.     if (!document)
  1061.         THROW(kODErrIllegalNullDocumentInput);
  1062.         
  1063.     TempPlatformFile    currentFile = 
  1064.         GetPlatformFileFromContainer(ev, document->GetContainer(ev));                            
  1065.     ODBoolean retval = ODCloseDocument(ev, session, document);
  1066.     currentFile->MoveToTrash();
  1067.     return retval;
  1068. }
  1069.  
  1070. //------------------------------------------------------------------------------
  1071. // ODSaveDocument
  1072. //------------------------------------------------------------------------------
  1073.  
  1074. void ODSaveDocument(Environment* ev, ODSession* session, ODDocument* document)
  1075. {
  1076.     WASSERT(session != kODNULL);
  1077.     WASSERT(document != kODNULL);
  1078.  
  1079.     if (!session)
  1080.         THROW(kODErrIllegalNullInput);
  1081.     if (!document)
  1082.         THROW(kODErrIllegalNullDocumentInput);
  1083.  
  1084.     ODDraft* tempDraft = ODGetTempDraftFromOpenDocument(ev, session, document);
  1085.     if (tempDraft)
  1086.     {
  1087.         WatchCursor();
  1088.         session->GetUndo(ev)->ClearActionHistory(ev, kODDontRespectMarks);
  1089.     
  1090.         // Fix desktop information which parallels the rootpart such as:
  1091.         // filename, comments, stationery bit, etc.
  1092.         SyncPropertiesToFile(ev, session, document);
  1093.     
  1094.         TempODStorageUnit su = tempDraft->AcquireDraftProperties(ev);
  1095.         ODSURemoveProperty(ev, su, kODPropUnsavedDocument);
  1096.         
  1097.         session->GetWindowState(ev)->Externalize(ev, tempDraft);
  1098.         tempDraft->Externalize(ev);
  1099.         session->GetLinkManager(ev)->DraftSaved(ev, tempDraft);
  1100.         session->GetClipboard(ev)->DraftSaved(ev, tempDraft);
  1101.     
  1102.         tempDraft->SaveToAPrevious(ev, kODNULL);
  1103.  
  1104.         ArrowCursor();
  1105.         session->GetDispatcher(ev)->InvalidateFacetUnderMouse(ev);
  1106.     }
  1107. }
  1108.  
  1109. //------------------------------------------------------------------------------
  1110. // ODSaveACopyOfDraft
  1111. //    Saves a copy of the draft.
  1112. //------------------------------------------------------------------------------
  1113.  
  1114. void ODSaveACopyOfDraft(Environment* ev, ODSession* session, ODDraft* fromDraft, 
  1115.                         PlatformFile* destinationFile)
  1116. {
  1117.     WASSERT(session != kODNULL);
  1118.     WASSERT(fromDraft != kODNULL);
  1119.     WASSERT(destinationFile != kODNULL);
  1120.  
  1121.     if (!session)
  1122.         THROW(kODErrIllegalNullInput);
  1123.  
  1124.     if (!fromDraft)
  1125.         THROW(kODErrIllegalNullDraftInput);
  1126.  
  1127.     if (!destinationFile)
  1128.         THROW(kODErrIllegalNullInput);
  1129.         
  1130.     WatchCursor();
  1131.     if (ODDraftHasWriteAccess(ev, fromDraft) && fromDraft->ChangedFromPrev(ev))
  1132.     {
  1133.         session->GetWindowState(ev)->Externalize(ev, fromDraft);
  1134.         fromDraft->Externalize(ev);
  1135.     }
  1136.     
  1137.     TempPlatformFile currentFile = 
  1138.         GetPlatformFileFromContainer(ev, fromDraft->GetDocument(ev)->GetContainer(ev));
  1139.     TempODStorageUnit partSU = ODAcquireRootPartSUOfDraft(ev, fromDraft);
  1140.     ODPlatformType fileType = ODGetIconFilePlatformTypeFromPartSU(ev, partSU);
  1141.     destinationFile->Create(currentFile->GetPlatformCreator(),fileType,0);
  1142.     
  1143.     TempODContainer    newContainer = 
  1144.         CreateFileContainer(ev, session, &(destinationFile->GetFileSpec()));    
  1145.     TempODDocument    newDocument = newContainer->AcquireDocument(ev, kODDefaultDocument);
  1146.     newDocument->SetBaseDraftFromForeignDraft(ev, fromDraft);
  1147.     TempODDraft    newDraft = newDocument->AcquireBaseDraft(ev, kODDPExclusiveWrite);
  1148.     TempODStorageUnit su = newDraft->AcquireDraftProperties(ev);
  1149.     ODSURemoveProperty(ev, su, kODPropUnsavedDocument);
  1150.     newDraft->Externalize(ev);
  1151.  
  1152.     ArrowCursor();
  1153. }
  1154.  
  1155. //------------------------------------------------------------------------------
  1156. // ODRevertDocument
  1157. //------------------------------------------------------------------------------
  1158.  
  1159. void ODRevertDocument(Environment* ev, ODSession* session, ODDocument* document)
  1160. {
  1161.     WASSERT(session != kODNULL);
  1162.     WASSERT(document != kODNULL);
  1163.     if (!session)
  1164.         THROW(kODErrIllegalNullInput);
  1165.     if (!document)
  1166.         THROW(kODErrIllegalNullDocumentInput);
  1167.  
  1168.     ODDraft* tempDraft = ODGetTempDraftFromOpenDocument(ev, session, document);
  1169.     if (tempDraft)
  1170.     {
  1171.         WatchCursor();
  1172.         ODCloseDraft(ev, session, tempDraft);    
  1173.         tempDraft->RemoveChanges(ev);
  1174.         ODOpenDraft(ev, session, tempDraft);
  1175.         SyncFileToProperties(ev, session, document);
  1176.         ArrowCursor();
  1177.         session->GetDispatcher(ev)->InvalidateFacetUnderMouse(ev);
  1178.     }
  1179. }
  1180. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2_ && !_PLATFORM_AIX_
  1181.  
  1182. #ifdef _PLATFORM_MACINTOSH_
  1183. //------------------------------------------------------------------------------
  1184. // ODDocumentInfo
  1185. //------------------------------------------------------------------------------
  1186.  
  1187. void ODDocumentInfo(Environment* ev, ODSession* session)
  1188. {
  1189.     WASSERT(session != kODNULL);
  1190.     if (!session)
  1191.         THROW(kODErrIllegalNullInput);
  1192.  
  1193.     ArrowCursor();
  1194.  
  1195.     ODFacet* infoFacet = kODNULL;
  1196.     ODBoolean hasWriteAccess = kODFalse;
  1197.     {
  1198.     TempODWindow window = session->GetWindowState(ev)->AcquireFrontRootWindow(ev);
  1199.     infoFacet = window->GetRootFacet(ev);
  1200.     hasWriteAccess = ODDraftHasWriteAccess(ev, ODGetDraftOfWindow(ev, window));
  1201.     }
  1202.     session->GetInfo(ev)->ShowPartFrameInfo(ev, infoFacet, hasWriteAccess);
  1203. }
  1204. #endif
  1205.  
  1206.  
  1207. //------------------------------------------------------------------------------
  1208. // ODIsTempDocument
  1209. //------------------------------------------------------------------------------
  1210.  
  1211. ODBoolean ODIsTempDocument(Environment* ev, ODSession* session, ODDocument* document)
  1212. {
  1213.     ODDraft* draft = ODGetTempDraftFromOpenDocument(ev, session, document);
  1214.     RETURN_IF_NULL(draft, kODFalse);
  1215.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  1216.     if (!su->Exists(ev, kODPropTempDocument, kODBoolean, 0))
  1217.         return kODFalse;
  1218.     return ODGetBooleanProp(ev, su, kODPropTempDocument, kODBoolean);
  1219. }
  1220.  
  1221. #if ( !defined (_PLATFORM_WIN32_) && !defined(_PLATFORM_OS2_) ) \
  1222.       && !defined(_PLATFORM_AIX_)
  1223. //------------------------------------------------------------------------------
  1224. // ODSetIsTempDocument
  1225. //------------------------------------------------------------------------------
  1226.  
  1227. void ODSetIsTempDocument(Environment* ev, ODDraft* draft, ODBoolean isTemp)
  1228. {
  1229.     if (!draft)
  1230.         return;
  1231.     TempODStorageUnit su = draft->AcquireDraftProperties(ev);
  1232.     if (isTemp)
  1233.         ODSetBooleanProp(ev, su, kODPropTempDocument, kODBoolean, isTemp);
  1234.     else
  1235.         ODSURemoveProperty(ev, su, kODPropTempDocument);
  1236. }
  1237.  
  1238. //------------------------------------------------------------------------------
  1239. // SyncFileToProperties
  1240. //------------------------------------------------------------------------------
  1241.  
  1242.  
  1243. void SyncFileToProperties(Environment* ev, ODSession* session, ODDocument* document)
  1244. {
  1245.     ODDraft*            tempDraft    = ODGetTempDraftFromOpenDocument(ev, session, document);
  1246.     TempODPart            rootPart    = ODAcquireRootPartOfDraft(ev, tempDraft);
  1247.     ODIText*            foo            = kODNULL;
  1248.     ODIconFamily        icons        = kODNULL;
  1249.     TempPlatformFile    file        = GetPlatformFileFromContainer(ev, document->GetContainer(ev));
  1250.     
  1251.     // filename
  1252.     foo = ODGetPOName(ev, rootPart, kODNULL);
  1253.     if (foo)
  1254.     {
  1255.         Str255    pName;
  1256.         GetITextPString(foo, pName);
  1257.         TRY
  1258.             file->Rename(pName);
  1259.         CATCH_ALL
  1260.         ENDTRY
  1261.         DisposeIText(foo);
  1262.         ODWindowState* windowState = session->GetWindowState(ev);
  1263.         windowState->SetDefaultWindowTitles(ev, tempDraft);
  1264.     }
  1265.     
  1266.     // stationery
  1267.     file->SetStationery(ODGetSUIsStationery(ev, rootPart->GetStorageUnit(ev)));
  1268.     
  1269.     // comments
  1270.     foo = ODGetPOComments(ev, rootPart, kODNULL);
  1271.     if (foo != kODNULL)
  1272.     {
  1273.         file->SetComments(foo);
  1274.         DisposeIText(foo);
  1275.     }
  1276.  
  1277.     // custom icon
  1278.     icons = ODGetPOIconFamily(ev, rootPart);
  1279.     file->SetCustomIconFamily(icons);
  1280.     if (icons)
  1281.         THROW_IF_ERROR( DisposeIconSuite(icons, kODTrue) );
  1282. }
  1283.  
  1284.  
  1285. //------------------------------------------------------------------------------
  1286. // SyncPropertiesToFile
  1287. //------------------------------------------------------------------------------
  1288.  
  1289. void SyncPropertiesToFile(Environment* ev, ODSession* session, ODDocument* document)
  1290. {
  1291.     TempODWindow        odWindow    = session->GetWindowState(ev)->AcquireFrontRootWindow(ev);
  1292.     ODFrame*            frame        = odWindow->GetRootFrame(ev);
  1293.     ODDraft*            tempDraft    = ODGetTempDraftFromOpenDocument(ev, session, document);
  1294.     TempODPart            rootPart    = ODAcquireRootPartOfDraft(ev, tempDraft);
  1295.     ODStorageUnit*        su            = ODGetSUFromPstObj(ev, (ODPart*)rootPart);
  1296.     ODIText*            foo            = kODNULL;
  1297.     ODIconFamily        icons        = kODNULL;
  1298.     TempPlatformFile    file        = GetPlatformFileFromContainer(ev, document->GetContainer(ev));
  1299.     
  1300.     // filename
  1301.     foo = file->GetName();
  1302.     if (foo)
  1303.     {
  1304.         ODSetPOName(ev, rootPart, foo);
  1305.         DisposeIText(foo);
  1306.     }
  1307.     
  1308.     // stationery
  1309.     ODSetSUIsStationery(ev, su, file->IsStationery());
  1310.  
  1311.     // comments
  1312.     //
  1313.     // this gets comments and makes sure that the file matches the property
  1314.     // we just need to make sure that the property matches the file
  1315.     foo = ODGetComments(ev, frame, kODNULL);
  1316.     if (foo != kODNULL)
  1317.     {
  1318.         ODSetPOComments(ev, rootPart, foo);
  1319.         DisposeIText(foo);
  1320.     }
  1321.  
  1322.     // custom icon
  1323.     icons = file->GetCustomIconFamily();
  1324.     ODSetPOIconFamily(ev, rootPart, icons, kODFalse);
  1325.     if (icons)
  1326.         THROW_IF_ERROR( DisposeIconSuite(icons, kODTrue) );
  1327. }
  1328.  
  1329. #endif // !_PLATFORM_WIN32_ && !_PLATFORM_OS2_ && !_PLATFORM_AIX_
  1330.