home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 January: Mac OS SDK / Dev.CD Jan 99 SDK1.toast / Development Kits / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAECountElements.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  5.0 KB  |  184 lines  |  [TEXT/CWIE]

  1. // SVAECountElements.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAECountElements.h"
  8.  
  9. #include "SVToken.h"
  10. #include "SVEditAEUtils.h"
  11. #include "SVAETextUtils.h"
  12. #include "SVAEWindowUtils.h"
  13.  
  14.  
  15. #pragma segment AppleEvent
  16.  
  17.  
  18. // -----------------------------------------------------------------------
  19. //    Name:       DoCountElements
  20. //    Purpose:    Handles the Number Of Elements AppleEvent.
  21. // -----------------------------------------------------------------------
  22.  
  23. pascal OSErr    DoCountElements(const AppleEvent    *theAppleEvent,
  24.                                       AppleEvent    *reply,
  25.                                       long            handlerRefCon)
  26. {
  27. #pragma unused (handlerRefCon)
  28.  
  29.     AEDesc       container = {typeNull, NULL},
  30.                 countDesc = {typeNull, NULL};
  31.     DescType     desiredType;
  32.     DescType     returnedType;
  33.     Size         actualSize;
  34.       OSErr        err;
  35.     
  36.         // pick up direct object, which is the container
  37.         // in which things are to be counted.
  38.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &container);
  39.     if (noErr != err) goto done;
  40.         
  41.         // now the class of objects to be counted
  42.     err = AEGetParamPtr(theAppleEvent, keyAEObjectClass, typeType,
  43.                                 &returnedType, (Ptr)&desiredType, sizeof(desiredType), &actualSize);
  44.     if (noErr != err) goto done;
  45.         
  46.         // missing any parameters?
  47.     err = GotRequiredParams(theAppleEvent);
  48.     if (noErr != err) goto done;
  49.     
  50.         // now get descriptor for count - put through function that
  51.         // can handle lists.
  52.     err = GetDescForNumberOfElements(desiredType, &container, &countDesc);
  53.     
  54.     err = AddResultToReply(&countDesc, reply, err);
  55.  
  56. done:
  57.     if (container.dataHandle)
  58.         AEDisposeDesc(&container);
  59.     
  60.     return(err);
  61. } // DoCountElements
  62.  
  63.  
  64. OSErr    GetDescForNumberOfElements(DescType desiredType, AEDesc* container, AEDesc* result)
  65. {
  66.     long        itemCount,
  67.                 index,
  68.                 elementCount;
  69.     AEDesc        tempDesc = {typeNull, NULL},
  70.                 aDesc = {typeNull, NULL},
  71.                 resultDesc = {typeNull, NULL};
  72.     DescType    returnedType;
  73.     OSErr        err;
  74.     
  75.             // If it's an object specifier, resolve into a token
  76.     if (typeObjectSpecifier == container->descriptorType)
  77.         err = AEResolve(container, kAEIDoMinimum, &tempDesc);
  78.     else    // Otherwise, just copy it
  79.         err = AEDuplicateDesc(container, &tempDesc);
  80.  
  81.     if (noErr != err) goto done;
  82.  
  83.     if (typeAEList == tempDesc.descriptorType)
  84.     {
  85.         err = AECreateList(NULL, 0 , false, result);    // Result will also be a list of items
  86.         if (noErr != err) goto done;
  87.         err = AECountItems(&tempDesc, &itemCount);
  88.         if (noErr != err) goto done;
  89.  
  90.         for (index = 1; index <= itemCount; index++)    // Do in forward order
  91.         {
  92.             err = AEGetNthDesc(&tempDesc, index, typeWildCard, &returnedType, &aDesc);
  93.  
  94.             if (noErr == err)        // Call this function recursively if necessary
  95.                 err = GetDescForNumberOfElements(desiredType, &aDesc, &resultDesc);
  96.             
  97.             if (noErr == err)        // Add item to the end of our list
  98.                 err = AEPutDesc(result, 0, &resultDesc);
  99.             
  100.             if (aDesc.dataHandle)
  101.                 AEDisposeDesc(&aDesc);
  102.             if (resultDesc.dataHandle)
  103.                 AEDisposeDesc(&resultDesc);
  104.         }
  105.     }
  106.     else
  107.     {
  108.         err = MyCountProc(desiredType, tempDesc.descriptorType, &tempDesc, &elementCount);
  109.         if (noErr != err) goto done;
  110.         err = AECreateDesc(typeLongInteger, (Ptr)&elementCount, sizeof(elementCount), result);
  111.     }
  112.  
  113. done:
  114.     if (aDesc.dataHandle)
  115.         AEDisposeDesc(&aDesc);
  116.     if (resultDesc.dataHandle)
  117.         AEDisposeDesc(&resultDesc);
  118.  
  119.     return(err);
  120. }
  121.  
  122.  
  123. // This count procedure is installed along with MyCaompareProc() to support
  124. // formTest and formWhose.
  125.  
  126. pascal OSErr MyCountProc(DescType desiredType, DescType containerClass,
  127.                                         const AEDesc *container, long* result)
  128. {   
  129.     AEDesc      aDesc = {typeNull, NULL},
  130.                 tempDesc = {typeNull, NULL};
  131.     TextToken   aTextToken;
  132.     Size        actualSize;
  133.     short        shortResult;
  134.     OSErr       err;
  135.         
  136.             // If it's an object specifier, resolve into a token
  137.     if (typeObjectSpecifier == container->descriptorType)
  138.         err = AEResolve(container, kAEIDoMinimum, &tempDesc);
  139.     else    // Otherwise, just copy it
  140.         err = AEDuplicateDesc(container, &tempDesc);
  141.         
  142.     if (noErr != err) goto done;
  143.     
  144.     *result = -1;            // easily recognized illegal value
  145.         
  146.     switch (desiredType)
  147.     {
  148.         case cDocument:
  149.         case cWindow:
  150.             if ((containerClass == typeNull) || (containerClass == cApplication))
  151.                 *result = CountWindows();
  152.             else
  153.                 err = errAEWrongDataType;
  154.             break;
  155.             
  156.         case cChar:
  157.         case cWord:
  158.         case cParagraph:
  159.             err = AECoerceDesc(&tempDesc, typeMyText, &aDesc);
  160.             if (typeNull == aDesc.descriptorType)
  161.                 err = errAENoSuchObject;
  162.             if (noErr != err) break;
  163.             GetRawDataFromDescriptor(&aDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  164.  
  165.             err = CountTextElements(TEHandleFromTextToken(&aTextToken),
  166.                                         aTextToken.tokenOffset, aTextToken.tokenLength,
  167.                                                                     desiredType, &shortResult);
  168.             if (noErr != err) break;
  169.             *result = shortResult;
  170.             break;
  171.             
  172.         default:
  173.             err = errAECantHandleClass;
  174.     }
  175.     
  176. done:
  177.     if (tempDesc.dataHandle)
  178.         AEDisposeDesc(&tempDesc);
  179.     if (aDesc.dataHandle)
  180.         AEDisposeDesc(&aDesc);
  181.         
  182.     return(err);
  183. }    // MyCountProc
  184.