mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-17 08:30:06 +02:00
162 lines
4.3 KiB
C
162 lines
4.3 KiB
C
#include <Drag.h>
|
|
#include <Errors.h>
|
|
#include <TextEdit.h>
|
|
#include <QuickDraw.h>
|
|
|
|
extern TEHandle hTERec;
|
|
// Handle drag from newswatcher -EAD
|
|
|
|
/*----------------------------------------------------------------------------
|
|
DragText
|
|
|
|
Drag selected text.
|
|
|
|
Entry: ev = pointer to mouse down event record.
|
|
where = location of mouse down event in local coords.
|
|
theTE = handle to TextEdit record.
|
|
|
|
Exit: function result = error code.
|
|
*dragged =
|
|
true if text was dragged.
|
|
false if mouse down was not over text selection, or
|
|
user did not move the mouse before releasing the
|
|
mouse button.
|
|
*trashed = true if text was dragged to trash.
|
|
----------------------------------------------------------------------------*/
|
|
extern RgnHandle rgn;
|
|
//extern EventRecord theEvent;
|
|
|
|
Boolean DragText (EventRecord *ev)
|
|
{
|
|
DragReference dragRef;
|
|
OSErr err = noErr;
|
|
Boolean haveDragRef = false;
|
|
Handle hText;
|
|
RgnHandle dragRgn, tempRgn;
|
|
short selStart, selEnd;
|
|
char state;
|
|
Point theLoc;
|
|
GrafPtr curPort;
|
|
|
|
// if (!PtInTEHiliteRgn(where, hTERec)) return noErr;
|
|
if (!WaitMouseMoved(ev->where)) return noErr;
|
|
|
|
GetPort(&curPort);
|
|
|
|
CopyRgn(rgn, dragRgn = NewRgn());
|
|
SetPt(&theLoc, 0, 0);
|
|
LocalToGlobal(&theLoc);
|
|
OffsetRgn(dragRgn, theLoc.h, theLoc.v);
|
|
|
|
hText = (**hTERec).hText;
|
|
selStart = (**hTERec).selStart;
|
|
selEnd = (**hTERec).selEnd;
|
|
|
|
err = NewDrag(&dragRef);
|
|
if (err != noErr) goto exit;
|
|
haveDragRef = true;
|
|
state = HGetState(hText);
|
|
HLock(hText);
|
|
err = AddDragItemFlavor(dragRef, 1, 'TEXT', *hText + selStart, selEnd - selStart, 0);
|
|
HSetState(hText, state);
|
|
if (err != noErr) goto exit;
|
|
// dragRgn = NewRgn();
|
|
// err = TEGetHiliteRgn(dragRgn, hTERec);
|
|
// if (err != noErr) goto exit;
|
|
// LocalToGlobalRgn(dragRgn);
|
|
// OutlineRegion(dragRgn);
|
|
SetDragItemBounds(dragRef, 1, &(**dragRgn).rgnBBox);
|
|
tempRgn = NewRgn();
|
|
CopyRgn(dragRgn, tempRgn);
|
|
InsetRgn(tempRgn, 1, 1);
|
|
DiffRgn(dragRgn, tempRgn, dragRgn);
|
|
DisposeRgn(tempRgn);
|
|
|
|
err = TrackDrag(dragRef, ev, dragRgn);
|
|
if (err != noErr && err != userCanceledErr) goto exit;
|
|
//*trashed = DragTargetWasTrash(dragRef);
|
|
// DisposeRgn(dragRgn);
|
|
|
|
DisposeDrag(dragRef);
|
|
return true;
|
|
|
|
exit:
|
|
|
|
if (haveDragRef) DisposeDrag(dragRef);
|
|
// if (dragRgn != nil) DisposeRgn(dragRgn);
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
LocalToGlobalRgn
|
|
|
|
Convert a region from local to global coordinates.
|
|
|
|
Entry: rgn = handle to region.
|
|
----------------------------------------------------------------------------*/
|
|
|
|
void LocalToGlobalRgn (RgnHandle rgn)
|
|
{
|
|
Point where;
|
|
|
|
SetPt(&where, 0, 0);
|
|
LocalToGlobal(&where);
|
|
OffsetRgn(rgn, where.h, where.v);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
OutlineRegion
|
|
|
|
Change a region into a tracing of its border which is appropriate
|
|
for normal dragging.
|
|
|
|
Entry: theRgn = handle to region.
|
|
|
|
Exit: Region changed to outline of region.
|
|
|
|
From Apple "HFS Drag Sample" sample code.
|
|
----------------------------------------------------------------------------*/
|
|
|
|
void OutlineRegion (RgnHandle theRgn)
|
|
{
|
|
RgnHandle tempRgn;
|
|
|
|
tempRgn = NewRgn();
|
|
CopyRgn(theRgn, tempRgn);
|
|
InsetRgn(tempRgn, 1, 1);
|
|
DiffRgn(theRgn, tempRgn, theRgn);
|
|
DisposeRgn(tempRgn);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
PtInTEHiliteRgn
|
|
|
|
Determine whether or not a point is in the current TextEdit hilite
|
|
region.
|
|
|
|
Entry: where = point in local coords.
|
|
theTE = handle to TextEdit record.
|
|
|
|
Exit: function result = true if point is in the hilite region.
|
|
----------------------------------------------------------------------------*/
|
|
|
|
Boolean PtInTEHiliteRgn (Point where, TEHandle theTE)
|
|
{
|
|
Boolean result = false;
|
|
RgnHandle rgn = nil;
|
|
OSErr err = noErr;
|
|
|
|
//if (!HaveTEGetHiliteRgn()) return false;
|
|
rgn = NewRgn();
|
|
err = TEGetHiliteRgn(rgn, theTE);
|
|
if (err != noErr) goto exit;
|
|
result = PtInRgn(where, rgn);
|
|
|
|
exit:
|
|
|
|
if (rgn != nil) DisposeRgn(rgn);
|
|
return result;
|
|
}
|