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.
Source/SVAEMove.c
/* |
File: SVAEMove.c |
Contains: |
Written by: Original version by Jon Lansdell and Nigel Humphreys. |
3.1 updates by Greg Sutton. |
Copyright: Copyright © 1995-1999 by Apple Computer, Inc., All Rights Reserved. |
You may incorporate this Apple sample source code into your program(s) without |
restriction. This Apple sample source code has been provided "AS IS" and the |
responsibility for its operation is yours. You are not permitted to redistribute |
this Apple sample source code as "Apple sample source code" after having made |
changes. If you're going to re-distribute the source, we require that you make |
it clear in the source that the code was descended from Apple sample source |
code, but that you've made changes. |
Change History (most recent first): |
7/20/1999 Karl Groethe Updated for Metrowerks Codewarror Pro 2.1 |
*/ |
#include "SVAEMove.h" |
#include "SVEditAEUtils.h" |
#include "SVEditWindow.h" // for DPtrFromWindowPtr() |
#include "SVAETextUtils.h" |
#include "SVAEDelete.h" |
#include "SVAECreate.h" |
#include "SVAEGetData.h" |
#pragma segment AppleEvent |
pascal OSErr DoMove(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) |
{ |
#pragma unused(handlerRefCon) |
AEDesc directObj = {typeNull, NULL}, |
insertHereDesc = {typeNull, NULL}, |
resultDesc = {typeNull, NULL}; |
OSErr err; |
err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj); |
if (noErr != err) goto done; |
err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc); |
if (noErr != err) goto done; |
// missing any parameters? |
err = GotRequiredParams(theAppleEvent); |
if (noErr != err) goto done; |
err = MoveDesc(&directObj, &insertHereDesc, &resultDesc); |
if (noErr != err) goto done; |
err = AddResultToReply(&resultDesc, reply, err); |
done: |
if (directObj.dataHandle) |
AEDisposeDesc(&directObj); |
if (insertHereDesc.dataHandle) |
AEDisposeDesc(&insertHereDesc); |
return(err); |
} |
OSErr MoveTextToken(TextToken* token, AEDesc* insertHereDesc, AEDesc* result) |
{ |
TextToken insertAtToken; |
AEDesc dataDesc = {typeNull, NULL}, |
insertDesc = {typeNull, NULL}, |
propertyDesc = {typeNull, NULL}; // Use to pass no properties |
DescType insertType; |
short numPartial; |
OSErr err; |
// Get the data descriptor to insert |
err = GetTextTextProperty(token, &dataDesc); |
if (noErr != err) goto done; |
// Get the place to insert it |
err = GetInsertDescFromInsertHere(insertHereDesc, &insertDesc, &insertType); |
if (noErr != err) goto done; |
if (typeNull == insertType) // Default to setting the selection in the front window |
err = errAETypeError; // GetWindowSelection(FrontWindow(), &insertAtToken, &oldLength); |
else // Otherwise get a selection from the insertDesc |
err = GetInsertToken(&insertDesc, insertType, &insertAtToken); |
if (noErr != err) goto done; |
// Sort out any moving onto self scenarios |
// and offsets changing due to deletion of where it was |
switch (TokenWithinToken(token, &insertAtToken, &numPartial)) |
{ |
case kTokenBefore: |
// Do Nothing |
break; |
case kTokenAfter: |
// Balance up for delete |
insertAtToken.tokenOffset -= token->tokenLength; |
break; |
case kTokenWithin: |
// tell document 1 of application "7Edit" |
// move first word to last character of first word |
// end tell |
insertAtToken.tokenOffset = token->tokenOffset; |
insertAtToken.tokenLength = 0; |
break; |
case kTokenPartialBefore: |
insertAtToken.tokenLength -= numPartial; |
break; |
case kTokenPartialAfter: |
insertAtToken.tokenOffset = token->tokenOffset; |
insertAtToken.tokenLength -= numPartial; |
break; |
} |
// Delete the text to be moved |
err = DeleteTextToken(token); |
if (noErr != err) goto done; |
// Secondly create the text wherever |
err = CreateAtTextToken(cText, &dataDesc, &insertAtToken, &propertyDesc, result); |
if (noErr != err) goto done; |
done: |
if (dataDesc.dataHandle) |
AEDisposeDesc(&dataDesc); |
return(err); |
} |
OSErr MoveTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result) |
{ |
TextToken aTextToken; |
Size actualSize; |
OSErr err; |
if (typeMyText != textDesc->descriptorType) |
return(errAETypeError); |
GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize); |
err = MoveTextToken(&aTextToken, insertHereDesc, result); |
return(err); |
} |
OSErr MoveDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result) |
{ |
AEDesc moveDesc = {typeNull, NULL}, |
textDesc = {typeNull, NULL}; |
OSErr err; |
if (typeObjectSpecifier == aDesc->descriptorType) |
err = AEResolve(aDesc, kAEIDoMinimum, &moveDesc); |
else |
err = AEDuplicateDesc(aDesc, &moveDesc); |
if (noErr != err) goto done; |
switch (moveDesc.descriptorType) |
{ |
case typeAEList: |
err = errAETypeError; |
// We can't handle moving more than one item because as |
// soon as one item is moved all the rest of the tokens |
// are likely to have their offsets messed up. |
// No doubt it can be done thoughÉ |
break; |
default: |
err = AECoerceDesc(&moveDesc, typeMyText, &textDesc); |
if (noErr != err) goto done; |
err = MoveTextDesc(&textDesc, insertHereDesc, result); |
} |
done: |
if (moveDesc.dataHandle) |
AEDisposeDesc(&moveDesc); |
if (textDesc.dataHandle) |
AEDisposeDesc(&textDesc); |
return(err); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-07-22