/* * ScintillaMacOSX.h * tutorial * * Original code by Evan Jones on Sun Sep 01 2002. * Contributors: * Shane Caraveo, ActiveState * Bernd Paradies, Adobe * */ #include "TView.h" #include #include #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "PlatMacOSX.h" #include "ScintillaWidget.h" #ifdef SCI_LEXER #include "SciLexer.h" #include "PropSetSimple.h" #include "ILexer.h" #include "LexAccessor.h" #include "Accessor.h" #endif #include "SVector.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "ContractionState.h" #include "CellBuffer.h" #include "CallTip.h" #include "KeyMap.h" #include "Indicator.h" #include "XPM.h" #include "LineMarker.h" #include "Style.h" #include "AutoComplete.h" #include "ViewStyle.h" #include "CharClassify.h" #include "Decoration.h" #include "Document.h" #include "Selection.h" #include "PositionCache.h" #include "Editor.h" #include "ScintillaBase.h" #include "ScintillaCallTip.h" static const OSType scintillaMacOSType = 'Scin'; namespace Scintilla { /** On the Mac, there is no WM_COMMAND or WM_NOTIFY message that can be sent back to the parent. Therefore, there must be a callback handler that acts like a Windows WndProc, where Scintilla can send notifications to. Use ScintillaMacOSX::registerNotifyHandler() to register such a handler. Messgae format is:
WM_COMMAND: HIWORD (wParam) = notification code, LOWORD (wParam) = 0 (no control ID), lParam = ScintillaMacOSX*
WM_NOTIFY: wParam = 0 (no control ID), lParam = ptr to SCNotification structure, with hwndFrom set to ScintillaMacOSX* */ typedef void(*SciNotifyFunc) (intptr_t windowid, unsigned int iMessage, uintptr_t wParam, uintptr_t lParam); /** Scintilla sends these two messages to the nofity handler. Please refer to the Windows API doc for details about the message format. */ #define WM_COMMAND 1001 #define WM_NOTIFY 1002 class ScintillaMacOSX : public ScintillaBase, public TView { public: HIViewRef vScrollBar; HIViewRef hScrollBar; SInt32 scrollBarFixedSize; SciNotifyFunc notifyProc; intptr_t notifyObj; bool capturedMouse; // true if scintilla initiated the drag session bool inDragSession() { return inDragDrop == ddDragging; }; bool isTracking; // Private so ScintillaMacOSX objects can not be copied ScintillaMacOSX(const ScintillaMacOSX &) : ScintillaBase(), TView( NULL ) {} ScintillaMacOSX &operator=(const ScintillaMacOSX &) { return * this; } public: /** This is the class ID that we've assigned to Scintilla. */ static const CFStringRef kScintillaClassID; static const ControlKind kScintillaKind; ScintillaMacOSX( void* windowid ); virtual ~ScintillaMacOSX(); //~ static void ClassInit(GtkObjectClass* object_class, GtkWidgetClass *widget_class); /** Returns the HIView object kind, needed to subclass TView. */ virtual ControlKind GetKind() { return kScintillaKind; } /// Register the notify callback void registerNotifyCallback(intptr_t windowid, SciNotifyFunc callback); private: virtual void Initialise(); virtual void Finalise(); // pasteboard support bool GetPasteboardData(PasteboardRef &pasteBoard, SelectionText *selectedText, bool *isFileURL); void SetPasteboardData(PasteboardRef &pasteBoard, const SelectionText &selectedText, bool inDragDropSession); char *GetStringFromCFString(CFStringRef &textString, int *textLen); // Drag and drop virtual void StartDrag(); Scintilla::Point GetDragPoint(DragRef inDrag); bool GetDragData(DragRef inDrag, PasteboardRef &pasteBoard, SelectionText *selectedText, bool *isFileURL); void SetDragCursor(DragRef inDrag); virtual bool DragEnter(DragRef inDrag ); virtual bool DragWithin(DragRef inDrag ); virtual bool DragLeave(DragRef inDrag ); virtual OSStatus DragReceive(DragRef inDrag ); void DragScroll(); int scrollSpeed; int scrollTicks; EventRecord mouseDownEvent; MouseTrackingRef mouseTrackingRef; MouseTrackingRegionID mouseTrackingID; HIPoint GetLocalPoint(::Point pt); void InsertCharacters (const UniChar* buf, int len); static pascal void IdleTimerEventHandler(EventLoopTimerRef inTimer, EventLoopIdleTimerMessage inState, void *scintilla ); public: // Public for scintilla_send_message virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); void SyncPaint( void* gc, PRectangle rc); //void FullPaint( void* gc ); virtual void Draw( RgnHandle rgn, CGContextRef gc ); virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); virtual void SetTicking(bool on); virtual bool SetIdle(bool on); virtual void SetMouseCapture(bool on); virtual bool HaveMouseCapture(); virtual PRectangle GetClientRectangle(); virtual void ScrollText(int linesToMove); virtual void SetVerticalScrollPos(); virtual void SetHorizontalScrollPos(); virtual bool ModifyScrollBars(int nMax, int nPage); virtual void ReconfigureScrollBars(); void Resize(int width, int height); static pascal void LiveScrollHandler( ControlHandle control, SInt16 part ); bool ScrollBarHit(HIPoint location); virtual void NotifyChange(); virtual void NotifyFocus(bool focus); virtual void NotifyParent(SCNotification scn); void NotifyKey(int key, int modifiers); void NotifyURIDropped(const char *list); #ifndef EXT_INPUT // Extended UTF8-UTF6-conversion to handle surrogate pairs correctly (CL265070) virtual int KeyDefault(int key, int modifiers); #endif static pascal OSStatus CommandEventHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* data ); bool HasSelection(); bool CanUndo(); bool CanRedo(); bool AlwaysTrue(); virtual void CopyToClipboard(const SelectionText &selectedText); virtual void Copy(); virtual bool CanPaste(); virtual void Paste(); virtual void Paste(bool rectangular); virtual void CreateCallTipWindow(PRectangle rc); virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true); virtual void ClaimSelection(); static sptr_t DirectFunction(ScintillaMacOSX *sciThis, unsigned int iMessage, uptr_t wParam, sptr_t lParam); /** Timer event handler. Simply turns around and calls Tick. */ virtual void TimerFired( EventLoopTimerRef ); virtual OSStatus BoundsChanged( UInt32 inOptions, const HIRect& inOriginalBounds, const HIRect& inCurrentBounds, RgnHandle inInvalRgn ); virtual ControlPartCode HitTest( const HIPoint& where ); virtual OSStatus SetFocusPart( ControlPartCode desiredFocus, RgnHandle, Boolean, ControlPartCode* outActualFocus ); virtual OSStatus TextInput( TCarbonEvent& event ); // Configure the features of this control virtual UInt32 GetBehaviors(); virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount, TCarbonEvent& inEvent ); virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); virtual OSStatus MouseDown( EventRecord *rec ); virtual OSStatus MouseUp( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); virtual OSStatus MouseUp( EventRecord *rec ); virtual OSStatus MouseDragged( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); virtual OSStatus MouseDragged( EventRecord *rec ); virtual OSStatus MouseEntered( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); virtual OSStatus MouseExited( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); virtual OSStatus MouseWheelMoved( EventMouseWheelAxis axis, SInt32 delta, UInt32 modifiers ); virtual OSStatus ContextualMenuClick( HIPoint& location ); virtual OSStatus ActiveStateChanged(); virtual void CallTipClick(); public: static HIViewRef Create(); private: static OSStatus Construct( HIViewRef inControl, TView** outView ); }; }