Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
Sources/MSAEDelete.c
// MSAEDelete.c  | 
//  | 
// Original version by Jon Lansdell and Nigel Humphreys.  | 
// 4.0 and 3.1 updates by Greg Sutton.  | 
// ©Apple Computer Inc 1996, all rights reserved.  | 
#include "MSAEDelete.h"  | 
#include "MSAEUtils.h"  | 
#include "MSWindow.h" // for DPtrFromWindowPtr()  | 
#include "MSAESelect.h"  | 
#pragma segment AppleEvent  | 
// -----------------------------------------------------------------------  | 
// Name: DoDelete  | 
// Purpose: Performs a delete text operation on the direct object,  | 
// if there is no direct object then delete the current  | 
// selection  | 
// -----------------------------------------------------------------------  | 
pascal OSErr DoDelete(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)  | 
{ | 
#ifdef __MWERKS__  | 
#pragma unused (reply, refcon)  | 
#endif  | 
    AEDesc      directObj = {typeNull, NULL}; | 
TextToken aTextToken;  | 
short ignore;  | 
OSErr err;  | 
err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);  | 
if (noErr != err) goto done;  | 
if (directObj.descriptorType != typeNull)  | 
err = DeleteDesc(&directObj);  | 
else  | 
    {           // Just delete the selection of the front window | 
err = GetWindowSelection(FrontWindow(), &aTextToken, &ignore);  | 
if (noErr != err) goto done;  | 
err = DeleteTextToken(&aTextToken);  | 
}  | 
done:  | 
(void)AEDisposeDesc(&directObj);  | 
return(err);  | 
} // DoDeleteEdit  | 
OSErr DeleteTextToken(TextToken* theToken)  | 
{ | 
WindowPtr aWindow;  | 
DPtr docPtr;  | 
TextToken oldSelection;  | 
short oldLength,  | 
insertLength; // Should be zero  | 
OSErr err;  | 
if (! theToken->tokenLength) // Pointless deleting nothing  | 
return(noErr);  | 
aWindow = theToken->tokenWindow;  | 
docPtr = DPtrFromWindowPtr(theToken->tokenWindow);  | 
if (! aWindow || ! docPtr)  | 
return(errAENoSuchObject);  | 
err = GetWindowSelection(aWindow, &oldSelection, &oldLength);  | 
if (noErr != err) goto done;  | 
err = SelectTextToken(theToken);  | 
if (noErr != err) goto done;  | 
TEDelete(docPtr->theText);  | 
docPtr->dirty = true;  | 
AdjustScrollbars(docPtr, false);  | 
DrawPageExtras(docPtr);  | 
err = UpdateSelectionToken(theToken, &oldSelection, oldLength, &insertLength);  | 
done:  | 
return(err);  | 
}  | 
OSErr DeleteTextDesc(AEDesc* textDesc)  | 
{ | 
TextToken aTextToken;  | 
Size actualSize;  | 
OSErr err;  | 
if (typeMyText != textDesc->descriptorType)  | 
return(errAETypeError);  | 
GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);  | 
err = DeleteTextToken(&aTextToken);  | 
return(err);  | 
}  | 
OSErr DeleteDesc(AEDesc* aDesc)  | 
{ | 
    AEDesc      deleteDesc = {typeNull, NULL}, | 
                textDesc = {typeNull, NULL}, | 
                itemDesc = {typeNull, NULL}; | 
long index;  | 
DescType theAEKeyword;  | 
OSErr err;  | 
if (typeObjectSpecifier == aDesc->descriptorType)  | 
err = AEResolve(aDesc, kAEIDoMinimum, &deleteDesc);  | 
else if (typeNull != aDesc->descriptorType)  | 
err = AEDuplicateDesc(aDesc, &deleteDesc);  | 
if (noErr != err) goto done;  | 
switch (deleteDesc.descriptorType)  | 
    { | 
case typeAEList:  | 
err = AECountItems(&deleteDesc, &index);  | 
if (noErr != err) goto done;  | 
for (; index > 0; index--) // Do backwards or offsets will screw up.  | 
            {                                   // Perhaps we should sort this list first. | 
// Can a query double up on offsets?  | 
err = AEGetNthDesc(&deleteDesc, index, typeWildCard, &theAEKeyword, &itemDesc);  | 
if (noErr != err) goto done;  | 
err = DeleteDesc(&itemDesc); // Call recursively  | 
if (noErr != err) goto done;  | 
(void)AEDisposeDesc(&itemDesc);  | 
}  | 
break;  | 
default:  | 
err = AECoerceDesc(&deleteDesc, typeMyText, &textDesc);  | 
if (noErr != err) goto done;  | 
err = DeleteTextDesc(&textDesc);  | 
}  | 
done:  | 
(void)AEDisposeDesc(&deleteDesc);  | 
(void)AEDisposeDesc(&textDesc);  | 
(void)AEDisposeDesc(&itemDesc);  | 
return(err);  | 
}  | 
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14