#ifndef _c_Text_Drag_And_Drop_Attachment_h #define _c_Text_Drag_And_Drop_Attachment_h // =========================================================================== // cTextDragAndDropAttachment.h Version 1.3.3 ©1998 Joakim Braun All rights reserved. // =========================================================================== // // CONTENTS: Various LAttachment subclasses that add drag and drop behavior to LTextEditViews, // LEditFields and LEditTexts. Supports drag and drop of text as well as of text files. // See cTextDragAndDropAttachment.cpp for details. // cTextDragAndDropAttachment is free for any and all use, // though I wouldn't mind receiving a free, enabled copy of any app that uses it. // Do not distribute modified source code under my name. // No support promised, no liability accepted. Provided "as is". // That said, I can be reached at braun@swipnet.se. // Latest version of this and more at http://home4.swipnet.se/~w-41308/ #include #include #include #include #include #include #include class cTextEditDragTask; class cTextDragAndDropAttachment : public LAttachment, public LDragAndDrop{ public: enum { class_ID = 'ddBs' }; cTextDragAndDropAttachment( Boolean inAllowTextFileDropping, Boolean inAcceptStyleData, ResIDT inCopyDragCursorID, PaneIDT inDropHilitePaneID, Boolean inDoCustomHiliting, Int16 inCustomHiliteInset); cTextDragAndDropAttachment(LStream *inStream); virtual ~cTextDragAndDropAttachment(void){} // Globally switch on or off drag and drop for these attachments static void SetDragEnable(Boolean inEnableDragAndDrop){ sAllowDragAndDrop = inEnableDragAndDrop; } static Boolean GetDragEnable(void){ return sAllowDragAndDrop; } virtual void MakeDragRegion(RgnHandle outValidRgn); virtual void AddDragFlavors( DragReference inDragRef); virtual void SetOwnerHost(LAttachable* inHost); // LDragAndDrop overrides virtual void HiliteDropArea( DragReference inDragRef); virtual void UnhiliteDropArea( DragReference inDragRef); virtual void DoDragReceive( DragReference inDragRef); virtual void EnterDropArea( DragReference inDragRef, Boolean inDragHasLeftSender); virtual void InsideDropArea( DragReference inDragRef); virtual void LeaveDropArea( DragReference inDragRef); virtual void ReceiveDragItem( DragReference inDragRef, DragAttributes inDragAttrs, ItemReference inItemRef, Rect &inItemBounds); virtual Boolean ItemIsAcceptable( DragReference inDragRef, ItemReference inItemRef); protected: enum { eTextDragItemFlavor = 'TEXT', eStyleDragItemFlavor = 'styl' }; enum { eDragCaretDrawn, eDragCaretNotDrawn, eDragCaretBadOffset = -1 }; static Boolean sAllowDragAndDrop; Int16 mLastDragCaretOffset, mDragCaretState, mCustomHiliteInset; UInt32 mLastDragCaretTime; Boolean mAllowTextFileDropping, mAcceptStyleData, mDoCustomHiliting; ResIDT mCopyDragCursorID; PaneIDT mDropHilitePaneID; cTextEditDragTask* mCurrDragTask; LPane* mTextEditPane; virtual void ExecuteSelf( MessageT inMessage, void *ioParam); void GetTextDropData( DragReference inDragRef, ItemReference inItemRef, Handle& outNewText, StScrpHandle& outNewStyles); virtual void ReceiveDroppedText(char* inText, Int16 inTextLength, StScrpHandle inStyles) {} virtual Boolean AdjustCursor(EventRecord &inMacEvent); virtual void AdjustDragCursor(DragReference inDragRef); virtual void UpdateDragCaret(DragReference inDragRef); virtual void DrawDragCaret(Int16 inOffset); virtual void GetTEHiliteRgn(RgnHandle outValidRgn); virtual RgnHandle GetDropHiliteRgn( DragReference inDragRef); virtual void DeleteDraggedSelection(void){} Boolean CheckForOptionKey(DragReference inDragRef); Int16 GetLineFromOffset(Int16 inOffset, TEHandle inTEhandle); virtual Boolean PointInTEHiliteRgn(Point inWhereLocal); virtual TEHandle GetMacTEH(void){ return NULL; } StScrpHandle MakePhonyStScrpHandle(TEHandle inMonostyledTEhandle); LPane* GetDropPane(void); friend class cTextEditDropAction; }; //****************************************************************** class cTextEditViewDDattachment : public cTextDragAndDropAttachment{ public: enum { class_ID = 'ddTV' }; cTextEditViewDDattachment( Boolean inAllowTextFileDropping, Boolean inAcceptStyleData, ResIDT inCopyDragCursorID, PaneIDT inDropHilitePaneID, Boolean inDoCustomHiliting, Int16 inCustomHiliteInset); cTextEditViewDDattachment(LStream *inStream); virtual ~cTextEditViewDDattachment(void){} virtual void SetOwnerHost(LAttachable* inHost); virtual void MakeDragRegion(RgnHandle outValidRgn); virtual void AddDragFlavors( DragReference inDragRef); virtual Boolean ItemIsAcceptable( DragReference inDragRef, ItemReference inItemRef); protected: LTextEditView* mTEview; virtual void ReceiveDroppedText(char* inText, Int16 inTextLength, StScrpHandle inStyles); virtual TEHandle GetMacTEH(void); virtual void DeleteDraggedSelection(void); virtual Boolean PointInTEHiliteRgn(Point inWhereLocal); }; //****************************************************************** class cEditFieldDDattachment : public cTextDragAndDropAttachment{ public: enum { class_ID = 'ddED' }; cEditFieldDDattachment( Boolean inAllowTextFileDropping, Boolean inAcceptStyleData, ResIDT inCopyDragCursorID, PaneIDT inDropHilitePaneID, Boolean inDoCustomHiliting, Int16 inCustomHiliteInset); cEditFieldDDattachment(LStream *inStream); virtual ~cEditFieldDDattachment(void){} virtual void SetOwnerHost(LAttachable* inHost); protected: LEditField* mEditField; virtual TEHandle GetMacTEH(void); virtual void DeleteDraggedSelection(void); virtual void ReceiveDroppedText(char* inText, Int16 inTextLength, StScrpHandle inStyles); }; //****************************************************************** class cEditTextDDattachment : public cTextDragAndDropAttachment{ public: enum { class_ID = 'ddEt' }; cEditTextDDattachment( Boolean inAllowTextFileDropping, Boolean inAcceptStyleData, ResIDT inCopyDragCursorID, PaneIDT inDropHilitePaneID, Boolean inDoCustomHiliting, Int16 inCustomHiliteInset); cEditTextDDattachment(LStream *inStream); virtual ~cEditTextDDattachment(void){} virtual void SetOwnerHost(LAttachable* inHost); protected: LEditText* mEditText; virtual TEHandle GetMacTEH(void); virtual void DeleteDraggedSelection(void); virtual void ReceiveDroppedText(char* inText, Int16 inTextLength, StScrpHandle inStyles); }; //****************************************************************** class cSmartTextDDAttachment : public cTextDragAndDropAttachment{ public: enum { class_ID = 'ddAt' }; cSmartTextDDAttachment( Boolean inAllowTextFileDropping, Boolean inAcceptStyleData, ResIDT inCopyDragCursorID, PaneIDT inDropHilitePaneID, Boolean inDoCustomHiliting, Int16 inTextEditViewCustomHiliteInset = 1, Int16 inEditFieldCustomHiliteInset = 1, Int16 inEditTextCustomHiliteInset = 3); cSmartTextDDAttachment(LStream *inStream); cSmartTextDDAttachment(LStream *inStream, Boolean inDummy); virtual ~cSmartTextDDAttachment(void){} virtual void SetOwnerHost(LAttachable* inHost); protected: Int16 mTextEditViewCustomHiliteInset, mEditFieldCustomHiliteInset, mEditTextCustomHiliteInset; void AddDragAndDropAttachment(LAttachable* inAttachable); }; //****************************************************************** class cViewTextDDAttachment : public cSmartTextDDAttachment{ public: enum { class_ID = 'ddVw' }; cViewTextDDAttachment( Boolean inAllowTextFileDropping, Boolean inAcceptStyleData, ResIDT inCopyDragCursorID, PaneIDT inDropHilitePaneID, Boolean inDoCustomHiliting); cViewTextDDAttachment(LStream *inStream); virtual ~cViewTextDDAttachment(void){} virtual void SetOwnerHost(LAttachable* inHost); protected: void AddDragAndDropToView(LView* inView); virtual void ExecuteSelf(MessageT inMessage, void* ioParam); }; //************************************************************************** class cTextEditDragTask : public LDragTask{ public: cTextEditDragTask(cTextDragAndDropAttachment* inDragAndDrop, const SMouseDownEvent &inMouseDown); protected: cTextDragAndDropAttachment* mDDAttachment; virtual void AddFlavors( DragReference inDragRef); virtual void MakeDragRegion( DragReference inDragRef, RgnHandle inDragRegion); }; //************************************************************************** class cSavedTextEditState{ public: // inNewOwner must be either LTextEditView or LEditField cSavedTextEditState(LPane* inNewOwner, Boolean inSaveState = true); ~cSavedTextEditState(void); void SaveState(void); void RestoreState(void); protected: LTextEditView* mTEview; LEditField* mEditField; LEditText* mEditText; Handle mSavedText; StScrpHandle mSavedStyles; Int16 mSavedSelStart, mSavedSelEnd; void RestoreTEViewState(void); void RestoreEditFieldState(void); void RestoreEditTextState(void); void DisposeData(void); TEHandle GetMacTEH(void); }; //************************************************************************** class cTextEditDropAction : public LAction{ public: cTextEditDropAction(cTextDragAndDropAttachment* inNewOwner, DragReference inDragRef); virtual ~cTextEditDropAction(void){} protected: cTextDragAndDropAttachment* mOwner; DragReference mDragRef; cSavedTextEditState mSavedUndroppedState, mSavedDroppedState; virtual void RedoSelf(); virtual void UndoSelf(); }; #endif