summaryrefslogtreecommitdiff
path: root/sys/mac/macdrag.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mac/macdrag.c')
-rw-r--r--sys/mac/macdrag.c161
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;
+}