diff options
Diffstat (limited to 'sys/mac/macdrag.c')
-rw-r--r-- | sys/mac/macdrag.c | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/sys/mac/macdrag.c b/sys/mac/macdrag.c new file mode 100644 index 0000000..559a278 --- /dev/null +++ b/sys/mac/macdrag.c @@ -0,0 +1,161 @@ +#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; +} |